【问题标题】:How to impose a condition creating a matrix in matlab如何在matlab中施加创建矩阵的条件
【发布时间】:2013-04-19 20:23:09
【问题描述】:

我想创建一个矩阵,其中包含 0 到 100 之间的 10 个数字的所有可能组合,间隔为 5,其总和等于 100。我的意思是这样的:

(0 0 0 0 0 0 0 0 0 10 90; 10 10 10 10 10 10 10 10 20 0;...)

我使用“allcomb.m”来创建介于 0 和 100 之间的所有可能数字,间隔为 5。但是,这个矩阵太大了,这意味着 Matlab 不会创建它。我在想,如果我有那个矩阵,我可以使用条件来减少它,但这是不可能的,因为我从来没有得到矩阵。 所以,问题是我如何使用相同代码中的条件修改 allcomb 的代码,或者更好的方法是创建我想要的矩阵的另一种方法。

【问题讨论】:

  • 我不知道你在matlab中是怎么做的,但是在python中你会使用一个生成器,例如仅当您要求下一个时才创建序列元素的对象,而不是一次创建所有元素。我想在这种情况下需要发生类似的事情

标签: matlab matrix combinations


【解决方案1】:

请注意,即使结果矩阵也非常大 - 准确地说,它有 10,015,005 行和 10 列,并且(如果存储为双精度)占用大约 1GB 的空间。在我的机器上计算大约需要十分钟。然而,它是可计算的,下面的函数会计算它。

function w = allconstrainedcombinations(n,k)
    if n == 1
        w = k;
    else
        t = nchoosek(n+k-1,k);  # Total number of rows
        w = zeros(t,n);         # Pre-allocate
        r = 1;                  # Current row
        for v = 0:k
            u = allconstrainedcombinations(n-1,k-v);
            m = size(u,1);
            w(r:r+m-1,1) = v;
            w(r:r+m-1,2:end) = u;
            r = r + m;
        end
    end
end

要得到你想要的结果,你应该调用

>> x = allconstrainedcombinations(10,20) * 5;

这是一个小例子的结果:

>> allconstrainedcombinations(3,2)
ans =
     0     0     2
     0     1     1
     0     2     0
     1     0     1
     1     1     0
     2     0     0

【讨论】:

  • 我什至不会尝试确认(或反驳)您的代码或您的计算,但 +1 是因为我花了这么多时间和精力来回答陌生人的问题。
  • @HighPerformanceMark 感谢您的称赞,但事实是我大约一年前为我自己的一个应用程序编写了这个函数,所以我为这个答案所做的只是清理代码,重命名它并检查它是否适用于 OP 的输入。
  • 非常感谢你,克里斯。正如 Mark 所说,您将时间花在我的问题上,或者只是分享您的代码,这非常了不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2018-08-10
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 2016-03-08
  • 2011-05-09
相关资源
最近更新 更多