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)一起很容易就达到了一些人的门槛:)我相信没有冒犯的意思,把它当作一个友好的建议(你会看到,有很多编辑在别人的帖子中改变了不太合理的东西。)好的,谢谢你们。