请问matlab分组全排列问题

来源:百度知道 编辑:UC知道 时间:2024/05/24 21:24:47
在下有这样的问题需要解决:例如1、2、3、4、5五个数,1和2分成一组,345分成一组,如何利用matlab实现才能得到12全排列,然后345全排列,最后得到2!*5!行的矩阵.矩阵如下:
[1 2 3 4 5
1 2 3 5 4
1 2 4 3 5
1 2 4 5 3
1 2 5 3 4
1 2 5 4 3
2 1 3 4 5
2 1 3 5 4
2 1 4 3 5
2 1 4 5 3
2 1 5 3 4
2 1 5 4 3]
以上仅仅代表一例,程序应当能够应对更多组的情况,谢谢达人请教。
写错了 应该是2!*3!行的矩阵
楼下牛人能否将程序做的完美一些呢
最好写成一个子程序,可以输入任意组数的数据,输入为向量,输出为我在上面写的矩阵形式,谢谢了
我的分数都给出来

修改了一下
不过有要求,那就是,两个数组最大长度不能大于9,
这个代码效率不是很高,但是做几个的排列组合是可以的。

在matlab下输入edit,将下面两行百分号之间的代码复制粘贴进去,保存。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function range=cmbarrange(A,B)
%下面A,B的长度不能超过9
lenA=length(A);
lenB=length(B);
if lenA>9 ||lenB>9
error('len(array) must less than 10')
return ;
end

%构造字符数组
chA=[];
for i=1:lenA
chA=strcat(chA,num2str(i));
end
chB=[];
for i=1:lenB
chB=strcat(chB,num2str(i));
end

%生成各自的全排列
head=perms(chA);
tail=perms(chB);

n1=size(head,1);
n2=size(tail,1);
range=zeros(n1*n2,lenA+lenB);
n=1;
for i=1:n1
for j=1:n2
headinfo=head(i,:);
tailinfo=tail(j,:);
for k=1:lenA
range(n,k)=A(str2num(headinfo(k)));
end
for k=1:lenB
range(n,lenA+k)=B(str2num(tailinfo(k)));
end
n=n+1;
end
end
%%%%%%%%%%%%%%