LennartNaeve_code/merging_tweezer_code/hubbard_matlab/perms.m
2025-04-25 20:52:11 +02:00

62 lines
1.4 KiB
Matlab

function P = perms(V)
%PERMS All possible permutations.
% PERMS(1:N), or PERMS(V) where V is a vector of length N, creates a
% matrix with N! rows and N columns containing all possible
% permutations of the N elements.
%
% This function is only practical for situations where N is less
% than about 10 (for N=11, the output takes over 3 gigabytes).
%
% Class support for input V:
% float: double, single
% integer: uint8, int8, uint16, int16, uint32, int32, uint64, int64
% logical, char
%
% See also NCHOOSEK, RANDPERM, PERMUTE.
% Copyright 1984-2015 The MathWorks, Inc.
[~,maxsize] = computer;
n = numel(V);
% Error if output dimensions are too large
if n*factorial(n) > maxsize
error(message('MATLAB:pmaxsize'))
end
V = V(:).'; % Make sure V is a row vector
n = length(V);
if n <= 1
P = V;
else
P = permsr(n);
if isequal(V, 1:n)
P = cast(P, 'like', V);
else
P = V(P);
end
end
%----------------------------------------
function P = permsr(n)
% subfunction to help with recursion
P = 1;
for nn=2:n
Psmall = P;
m = size(Psmall,1);
% P = zeros();
P = sparse(nn*m,nn);
P(1:m, 1) = nn;
P(1:m, 2:end) = Psmall;
for i = nn-1:-1:1
reorder = [1:i-1, i+1:nn];
% assign the next m rows in P.
P((nn-i)*m+1:(nn-i+1)*m,1) = i;
P((nn-i)*m+1:(nn-i+1)*m,2:end) = reorder(Psmall);
end
end