matlab中的双重求和

时间:2014-12-01 17:23:03

标签: matlab optimization

我有一个关于matlab的(初学者)问题。我尝试了几件事(例如:将其写为矢量化循环或将其写为'if-loop'并明确计算总和),但我一直犯错误,因此,我在matlab中不断出现错误。

我必须最大化以下功能:

\sum_{i=1}^{L} \sum_{k=1}^K (r_k^3 t_{ik})

以L,K,r_k着称。此外,t_ik是desicion变量,因此它们的值为{0,1}。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:3)

如果您正在寻找更多矢量化结果,您可以在总和中bsxfun创建产品,然后sum在整个矩阵上创建产品以获得答案(例如,Adam Farabaugh)。您在LaTeX表单中的等式看起来像这样(我更容易阅读):

看起来t是2D矩阵,而r是矢量。使用上面的语句,看起来你正在占用t的每一行,并将这一行以逐个元素的方式与r相乘,r中的每个元素都被提升到第三种力量。您对t中的所有行重复此操作,然后总结结果。假设r是行向量,并且t中的列数与r中的元素数相匹配,请执行以下操作:

prods = bsxfun(@times, r.^3, t);
result = sum(prods(:));

第一个语句将采用r并创建一个矩阵,其中此矩阵的每一行都是r提升到第三个幂的副本。这是bsxfun的结果,它是 Binary Singleton EXpansion FUNction 的缩写。简而言之,它复制了两者之间维度较小的变量的任何维度,并复制元素以使两个变量的大小匹配。

然后我们采用这个新矩阵,并使用矩阵t进行逐元素乘法。一旦我们这样做,我们简单地总结该矩阵中的所有元素。您可以像Adam建议的那样嵌套sum次调用,但是如果您真的想让它更通用,您只需展开矩阵,使其成为单个向量,然后应用{{1在这个单一的向量上。

答案 1 :(得分:0)

您正在描述双循环:

result=0;
for i=1:L 
   for k=1:K 
      result=r(K)^3*t(i*k)+result ;
   end 
end

但是我相信你的问题与matlab无关,你只是不知道如何从数学转换为代码。

答案 2 :(得分:-2)

如果有人来看,正确的方法是

sum(sum(a))

其中a是你的矩阵。这也可以扩展到更多尺寸。