【发布时间】: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])
它不会返回我想要的。
谢谢
【问题讨论】:
标签: matlab
我在 Matlab 中有一个名为 P 的 4x4 矩阵。我想将 P 提高到一个幂(比如 X)以创建一个新的 4x4 矩阵。然后,我想将该矩阵从 0 加到 51(即 P^0 + P^1 + ... + P^52)
当然,写完这会花费很长时间。有没有办法缩短这个?
我已经尝试过以下代码:
syms k
symsum(P^k, k, [0 51])
它不会返回我想要的。
谢谢
【问题讨论】:
标签: matlab
可以使用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])
【讨论】:
由于您使用的是符号数学,我希望您不会遇到循环问题。
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
【讨论】:
您可以使用subs(八度音阶)进行如下操作:
syms 'P' 'k';
subs(symsum(P^k, k, [0 51]), [1 1;1 1])
例如P = [1 1; 1 1]。
【讨论】:
如果有一个地方,在@gnovice 的一些好主意之后,我的直觉只是将它矢量化。这只是 gnovice 所做的另一种方式,但在我看来,它比 bsxfun 更具可读性。
result=reshape(sum(P(:).^[0:51],2),size(P))
【讨论】: