【问题标题】:Summation notation for matrices in MatlabMatlab中矩阵的求和符号
【发布时间】:2017-09-05 15:34:23
【问题描述】:

我在 Matlab 中有一个名为 P 的 4x4 矩阵。我想将 P 提高到一个幂(比如 X)以创建一个新的 4x4 矩阵。然后,我想将该矩阵从 0 加到 51(即 P^0 + P^1 + ... + P^52)

当然,写完这会花费很长时间。有没有办法缩短这个?

我已经尝试过以下代码:

 syms k

 symsum(P^k, k, [0 51])

它不会返回我想要的。

谢谢

【问题讨论】:

  • 051 不包括 52
  • 请注意matrix power (^) 与元素功率(.^) 不同。

标签: matlab


【解决方案1】:

可以使用bsxfun 完成矢量化解决方案,如下所示:

result = sum(bsxfun(@power, P, reshape(0:51, [1 1 52])), 3);

对于 MATLAB R2016b 及更高版本,这可以通过 implicit expansion 完成(在其他语言中称为“广播”):

result = sum(P.^reshape(0:51, [1 1 52]), 3);

如果您真的尝试这样做symbolically 并没有得到您想要的结果,可能是因为您使用了错误的运算符。 matrix power operator^,而 element-wise power operator.^。你可能想要这个(P 是一个 4×4 数字矩阵):

syms k
symsum(P.^k, k, [0 51])

【讨论】:

    【解决方案2】:

    由于您使用的是符号数学,我希望您不会遇到循环问题。

    req_sum = zeros(size(P));
    for k=0:51                   %loop for all the powers
        req_sum = req_sum + P^k; %adding the results of each iteration
    end
    

    【讨论】:

      【解决方案3】:

      您可以使用subs(八度音阶)进行如下操作:

      syms 'P' 'k';
      subs(symsum(P^k, k, [0 51]), [1 1;1 1])
      

      例如P = [1 1; 1 1]

      【讨论】:

        【解决方案4】:

        如果有一个地方,在@gnovice 的一些好主意之后,我的直觉只是将它矢量化。这只是 gnovice 所做的另一种方式,但在我看来,它比 bsxfun 更具可读性。

        result=reshape(sum(P(:).^[0:51],2),size(P))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-23
          • 1970-01-01
          • 1970-01-01
          • 2012-08-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多