首页 > 解决方案 > 在matlab中打印n选择k个组合

问题描述

我需要在 matlab 中创建一个算法,它返回 k 集中 n 子集的任意组合。例如,我有一个集合 {1,2,3,4,5},我需要包含在这个集合中的 3 个数字的任意组合。所以这个函数应该返回:

[[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 3, 4], [1, 3, 5], [1, 4, 5], [ 2, 3, 4], [2, 3, 5], [2, 4, 5], [3, 4, 5]]

我曾尝试自己写它,但没有成功,我放弃了。它部分有效,但会产生无限循环。

for i=1:n
    if(firstTime)
        lastComb=min //123
        firstTime=false
    else
        for d=k:-1:1
            while(lastComb(:,end) < n-k+d && lastComb(:,end)<=n)
                newComb=lastComb
                newComb(d)=lastComb(d)+1
                combos= [combos; newComb]
                lastComb=newComb
            end
            while(lastComb(:,end) > n-k+d && lastComb(:,end)<=n)
                newComb=lastComb
                for p=d:-1:1

                    if(newComb(p)+1 <=n)
                        newComb(p)=newComb(p)+1
                        combos= [combos; newComb]
                    end
                end
            end
        end
    end
end

标签: matlabcombinations

解决方案


总体而言,您的语法有点混乱(正如其他人之前所说的那样)。如果您在此处发布问题,最好包含所有代码,包括定义的变量,以便于帮助您。

我看到的一些主要问题如下:

(1) 你似乎只得到“n”个组合与你正在写的东西,我认为这是 3 个组合。相反,您应该得到 10 种组合。这个函数的开头应该有一个组合计算[nCk = n!/((nk)!*k!)]。

(2) 您将第一个组合定义为 1、2、3,但随后您没有将其定义为您正在制作的“组合”集合。取而代之的是,在它达到“组合”之前将其替换为其他东西。

还有更多,但尝试修复这些部分,其他部分可能会自然而然。

总的来说,这个功能已经存在。如果遇到困难,只需在 MATLAB 中输入“open nchoosek”即可查看您正在尝试的改进版本!


推荐阅读