作者celestialgod (攸蓝)
看板MATLAB
标题Re: [讨论] 矩阵排列组合
时间Sun Sep 8 03:55:15 2013
※ 引述《whale0821 (DorisTsai)》之铭言:
: 想请问关於一个矩阵的问题
: 举例
: 若有两个矩阵为
: A=[1 2 3]
: B=[4 5 6]
: 想组合成
: C=[1 2 3;
: 1 2 6;
: 1 5 3;
: 1 5 6;
: 4 2 3;
: 4 2 6;
: 4 5 3;
: 4 5 6;]
: 8种排列组合,
: 第一个位置只有1,4 两个选择
: 第二个位置只有2,5 两个选择
: ...以次类推
: 请问有比较快的指令或是怎麽写回圈比较好呢?
: 如果矩阵皆是1*n的话
: 谢谢
想法很简单,因为只从两个向量去排
而且他的排列方式有限,先知道他的dim有多大就很简单了
number of rows(rowNum)就depends on你的input vectors: a, b有多少个一样
如果两个元素不同,那就先每一个都重复rowNum/2次
第二次两个元素不同就,每一个重复rowNum/4次,全部在重复一次
剩下依此类推,然後如果相同就全部都用一样的取代。
程式码如下:
% 先写一个rep的函数
***********rep.m************
function vec_output=rep(vec_input, each, times)
vec_output=repmat(vec_input, each, times);
vec_output=vec_output(:);
***********main.m*************
function mat=main(v1,v2)
% input v1 and v2
% output mat
vec_eq = v1~=v2;
rowNum = 2^sum(vec_eq);
each = rowNum/2;
times = rowNum/each/2;
for i=1:length(v1)
if(vec_eq(i)==1)
mat(:,i)=rep([v1(i) v2(i)],each,times);
each=each/2;
times=rowNum/each/2;
else
mat(:,i)=rep(v1(i), 1, rowNum);
end
end
***********test 1**************
v1=1:3;
v2=4:6;
mat=main(v1,v2);
mat
1 2 3
1 2 6
1 5 3
1 5 6
4 2 3
4 2 6
4 5 3
4 5 6
***********test 2**************
v1 = 1:5;
v2 = [2 2 3 3 5];
mat=main(v1,v2);
mat
1 2 3 4 5
1 2 3 3 5
2 2 3 4 5
2 2 3 3 5
**********The End**************
希望有帮助到你。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.164.166.108
※ 编辑: celestialgod 来自: 218.164.166.108 (09/08 04:09)
1F:→ celestialgod:效率问题,我就比较无法了,可以问问其他高人XD 09/08 04:10
※ 编辑: celestialgod 来自: 218.164.166.108 (09/08 16:12)