A = {[1 1 0] [1 1 1] [0 1 1];[1 0 0] [1 1 1] [0 0 1]};
B = A(:);
B = cell2mat(B);
n = size(B,1);
% P = perms(1:n);
% 从 r 个 1:n 中各取一个元素生成子集 P
r = n;
pct = prod((n-r+1):n); % prod(1:n)/prod(1:(n-r));
P = zeros(n^r,r); % 结果预设
zz = (1:n)';
for k = r:-1:1 % 从后往前取参数逐列生成结果列
j = n^(r-k); % 第 k 列第 k 个参数单个元素单次循环次数
z = repmat(zz,1,j)'; % 重复拷贝 j 次
z = z(:); % 生成单列矩阵
tm = n^(k-1); % 第 k 列第 k 个参数全循环次数
z = repmat(z,1,tm); % 重复 tm 次
P(:,k) = z(:); % 第 k 列生成并加入到结果中
end;
% 删除重复提取的元素组
a = P'; % 转置 P
a = diff(sort(a))'; % 按列排序后按行差分,相同元素差为 0
if r > 2
L = prod(a'); % 转置 a 后按列累乘,有 0 元素结果为 0
else
L = a';
end;
L(L~=0) = 1; % 非 0 元素置为 1,便于后面转换为逻辑值
P = P(logical(L'),:); % 取出无重复元素的行
for k = 1:size(P,1)
a = P(k,:);
t = B(a,:)';
R(k,:) = t(:)';
end
追问您好,是把一个数组看成一个整体,对每个小整体进行全排列,我看您的程序好像是对数组内的元素进行排列了,还有,如果可以的话能不能固定其中的一个数组位置不动,然后对剩下的数组进行全排列?恳求答案,如果能帮忙的话我会采纳答案并且提高悬赏,十分感谢!
追答%% 以上是将元胞内每个元素作为整体来全排列的(prod(1:6)=720)
%% 下面是固定某位置的排列(在下面位置增加两行代码)
......
L(L~=0) = 1; % 非 0 元素置为 1,便于后面转换为逻辑值
P = P(logical(L'),:); % 取出无重复元素的行
% 固定A中第2行第2列在排列结果的第1位
% 实现:1. 将第2行第2列转换为单下标(4)
% 2. 将索引列表P中第1位不是4的行删除掉
ind = sub2ind(size(A),2,2); %%%% 增加1
P(P(:,1)~=4,:) = []; %%%% 增加2
for k = 1:size(P,1)
a = P(k,:);
t = B(a,:)';
R(k,:) = t(:)';
end