请问怎么用matlab实现胞元数组内元素的全排列?

例如A=cell(2,3);A={[110][111][011];[100][111][001]}让A内的各个一维数组进行全排列,并输出。这只是一个简单的例子,不能用pe... 例如A=cell(2,3);
A={[1 1 0] [1 1 1] [0 1 1];[1 0 0] [1 1 1] [0 0 1]}
让A内的各个一维数组进行全排列,并输出。
这只是一个简单的例子,不能用perms函数,因为有可能胞元内元素数量大于10个,最好用循环。
十分感谢!!!!
如果可以的话,另加一个条件,就是固定胞元中两个数组的位置不动,全排列剩下的数组,生成的每一个排列后的数组组成的胞元和A一样,都是2*3,谢谢!
另外,由于数组的数量过多,实例中比6会多,是20个,在运算过程中matlab总是提示错误,超出程序允许的最大变量值,希望得到解决!!!
展开
 我来答
qingningleyun
推荐于2016-05-04 · TA获得超过5854个赞
知道大有可为答主
回答量:2991
采纳率:30%
帮助的人:3111万
展开全部
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
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式