MATLAB取向量中整数,迭代所有整数向量,总结到MATLAB中的某个值?

这是一个使用递归的快速而脏的方法.我们的想法是,为了生成长度为k的所有向量,总和为n,首先生成长度为k-1的向量,对于每个i = 1..n,求和为ni,然后在每个向量的末尾添加一个额外的i.这些.

您可以通过在每个循环中预先分配x来加快速度.

注意,输出的大小是(n k – 1选择n)行和k列.

function x = genperms(n, k)

if k == 1

x = n;

elseif n == 0

x = zeros(1,k);

else

x = zeros(0, k);

for i = 0:n

y = genperms(n-i,k-1);

y(:,end+1) = i;

x = [x; y];

end

end

编辑

正如评论中所提到的,这将遇到大n和k的内存问题.流传输解决方案是优选的,其一次一个地生成输出.在像Haskell这样的非严格语言中,这非常简单 –

genperms n k

| k == 1 = return [n]

| n == 0 = return (replicate k 0)

| otherwise = [i:y | i

>> mapM_ print $take 10 $genperms 100 30

[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100]

[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,99]

[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,98]

[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,97]

[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,96]

[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,95]

[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,94]

[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,93]

[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,92]

[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,91]

几乎瞬间运行 – 无需担心内存问题.

在Python中,您可以使用generator和yield关键字实现几乎同样简单的操作.在Matlab中它肯定是可能的,但我把翻译留给你了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值