matlab - 在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
解决方案
总体而言,您的语法有点混乱(正如其他人之前所说的那样)。如果您在此处发布问题,最好包含所有代码,包括定义的变量,以便于帮助您。
我看到的一些主要问题如下:
(1) 你似乎只得到“n”个组合与你正在写的东西,我认为这是 3 个组合。相反,您应该得到 10 种组合。这个函数的开头应该有一个组合计算[nCk = n!/((nk)!*k!)]。
(2) 您将第一个组合定义为 1、2、3,但随后您没有将其定义为您正在制作的“组合”集合。取而代之的是,在它达到“组合”之前将其替换为其他东西。
还有更多,但尝试修复这些部分,其他部分可能会自然而然。
总的来说,这个功能已经存在。如果遇到困难,只需在 MATLAB 中输入“open nchoosek”即可查看您正在尝试的改进版本!
推荐阅读
- git - 将参数传递给 git 别名不起作用
- python - 创建一个接受列表的函数,在列表中创建从 1 开始大小递增的块,反之亦然
- apache-flink - Flink 嵌套类 toDataStream 转换报错
- html - 将页脚保持在长页面的底部,并带有绝对定位的子项
- c++ - 尝试在 Red Hat 7.9 上使用 gcc 编译时出错“gcc:尝试执行 'cc1plus' 时出错:execvp:权限被拒绝”
- python - 如何在python中多处理一个函数
- java - 生成一个使用其所有位的随机长值
- android - 如何使用另一个驱动器(android studio)中存在的现有图像创建虚拟设备?
- class - 生成内的 SystemVerilog 类
- python - 如何爬取需要 Python 帐户的网站?