Matlab k尺寸p的不同组合,无需更换
从整数Matlab k尺寸p的不同组合,无需更换,matlab,random,numbers,combinations,Matlab,Random,Numbers,Combinations,从整数1,…,N中,我想取k个不同的随机组合,而不重复大小p。例如,如果N=10、k=4和p=3,可能的结果是: 1 4 9 9 4 2 3 5 2 1 8 4 但不是: 1 4 9 9 4 2 3 5 3 1 9 4 原因有二: [1 4 9]和[1 9 4]是相同的组合 [3 5 3]并非没有重复 请注意,获取所有可能的组合以及(随机)选择k个组合很容易出现内存问题。好的,我找到了一个适合我的解决方案。我主要关注的是: 我希望k组合是随机的 处理时间 下面的函数对每次迭代中大小p(即
1,…,N
中,我想取k个不同的随机组合,而不重复大小p
。例如,如果N=10
、k=4
和p=3
,可能的结果是:
1 4 9
9 4 2
3 5 2
1 8 4
但不是:
1 4 9
9 4 2
3 5 3
1 9 4
原因有二:
[1 4 9]
和[1 9 4]
是相同的组合[3 5 3]
并非没有重复请注意,获取所有可能的组合以及(随机)选择
k个组合很容易出现内存问题。好的,我找到了一个适合我的解决方案。我主要关注的是:
- 我希望
k
组合是随机的李>
- 处理时间李>
下面的函数对每次迭代中大小p
(即row=randperm(N,p)
)的单个随机组合进行采样,如果该组合尚未出现,则添加该组合
在这三个参数中,主要k
影响处理时间。对于不太大的k
,此代码在几秒钟内运行。我自己将遇到的最极端的情况是N=10^6,k=2000,p=10
,它仍然在1秒内运行
我希望这也能帮助其他人,因为我在多个网站上遇到过这个问题,但没有一个令人满意的答案
function C = kcombsn(N,k,p)
C = randperm(N,p);
Csort = sort(C,2);
while size(C,1) < k
row = randperm(N,p);
row_sort = sort(row);
if isempty(intersect(row_sort,Csort,'rows'))
C = [C; row];
Csort = [Csort; row_sort];
end
end
end
函数C=kcombsn(N,k,p)
C=randperm(N,p);
Csort=排序(C,2);
而尺寸(C,1)
编辑:
我也是。我之所以删掉前两个单词,是因为它包含在标记中。这就是标签的用途。第二:至少要像“MATLAB”那样编写,就像MathWorks所说的那样,如果你坚持要把它保存在那里。是的,我的经验是,即使它在标签中,显式地编写MATLAB,或者按照你的意愿编写MATLAB,会让人们更加了解它。这就是我把它放回去的原因。我不知道这是一种犯罪,看到别人又把它拿了出来……这不是犯罪,只是多余的。人们通常通过语言标签来浏览,因此最终通过MATLAB标签来回答这个问题。因此,它倾向于使问题尽可能简短和切中要害,以便未来的用户能够尽可能快地找到所需的信息;这也是我删掉第一段的原因。Ander再次将其编辑掉的原因可能是,尽管将语言名称放在这里并不是非常罕见或多余,但粗体格式使其毫无理由地脱颖而出。@EricSchols这不是刑事犯罪,而是使用了粗体字和MATLAB最糟糕的拼写(/MATLAB for me)一起很容易就达到了一些人的门槛:)我相信没有冒犯的意思,把它当作一个友好的建议(你会看到,有很多编辑在别人的帖子中改变了不太合理的东西。)好的,谢谢你们。