作者mp19990920 (郝渴连)
看板MATLAB
标题Re: [问题] 排列组合问题
时间Wed Apr 10 18:17:49 2013
※ 引述《snaredrum (好听木琴)》之铭言:
: Matlab菜鸟发问~~
: 我想要写21个七维向量
: 写法如下,
: v1= (5/7,5/7,-2/7,-2/7,-2/7,-2/7,-2/7)
: v2= ...
: ....
: v21= ...
: 这21个向量都是五个5/7,跟两个-2/7排列组合 ...一共7!/(2!5!) =21
: 最後我想要一个矩阵, F= [v1,v2....v21] 7x21的矩阵。
: 请问要如何generate这个矩阵阿?
: 我想知道系统一点的方法写,因为下一个可能是要28个36个45个 etc..
: 不能一值硬干下去的
: 感恩~~~
: 该用回圈嬷?
:
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 71.114.93.173
: 推 sunev:nchoosek 04/09 10:16
: → snaredrum:thanks~ 04/09 10:28
: → jatj:楼上不对喔 这要用perms 04/09 10:29
: → jatj:Y = unique(perms([1 1 2 2 2 2 2])); 把1 2取代你要的即可 04/09 10:32
: → jatj:sorry Y = unique(perms([1 1 2 2 2 2 2]), 'rows');才对 04/09 10:36
perms产生的矩阵太大了
而且还需要经过 unique(sort)
: → jatj:少一个引数 04/09 10:36
: → jatj:不过请小心perms数量太多的记忆体及速度问题 元素太多建议 04/09 10:38
: → jatj:自己用loop产生 04/09 10:39
: 推 sunev:v1=[-2 -2 5 5 5 5 5]/7;v2=[5 5 5 5 5 -2 -2]/7; 04/09 15:14
: → sunev:[nchoosek(v1,2) nchoosek(v2,5)] 04/09 15:14
这个方法有问题
无法保证 5/7 只出现 2 次
: → snaredrum:thank you~ 04/10 05:32
我建议方法如下:
n为向量的dimension
k为5/7的个数
binary = dec2bin(0:2^n-1)=='1';
binary(sum(binary, 2)~=k, :)=[];
F = 5/7*ones(size(binary, 1), n) - binary;
若要random的排列
F = F(randperm(size(binary, 1)), :);
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.67.56.146
※ 编辑: mp19990920 来自: 111.67.56.146 (04/10 18:21)
1F:推 sunev:抱歉没想清楚。 04/10 18:45
2F:→ sunev:v=[-2 -2 5 5 5 5 5]/7;c1=nchoosek(v,2);c2=nchoosek(v,5); 04/10 18:46
3F:→ sunev:[c1(end:-1:1,:) c2] 04/10 18:46
4F:→ jatj:所以我说我的方法要注意记忆体 速度问题 04/11 07:54