我必须按M = M + c*a*a'
多次执行矩阵更新,其中c
是常量, a 是列向量。如果矩阵的大小大于1000,这个简单的更新将占用我的函数的大部分时间,通常profile
计算的时间超过1分钟。
主要代码是:
for i = 1:N
_do something..._
for k = 1:n
a(1:k) = M(1:k,1:k)*p(1:k);
M(1:k,1:k) = M(1:k,1:k)+c*a(1:k)*a(1:k)';
M(1:k, k+1) = b(1:k);
M(k+1, 1:k) = b(1:k)';
M(k+1, k+1) = x;
......
end
end
我已预先分配了所有变量,已知列向量 p 和 b ,而x
是另一个常量。
由于我要通过此函数处理大量数据,是否存在更有效的替代此矩阵更新?
答案 0 :(得分:0)
您可以连接a
向量以创建矩阵A
,然后只应用乘法一次。
A =[a1 a2 a3];
M = c * A * A.';
考虑示例
A = rand(5,5);
M = 0;
c=4;
for n = 1:5
M = M + c * A(:,n) * A(:,n).';
end
和这一个
M1 = c * A * A.'
M
和M1
相等
答案 1 :(得分:0)
您是否尝试过使用bsxfun?
在任何情况下,bsxfun比常规乘法更快 ,但是矢量/矩阵必须具有相同的长度(它们适合你,不是吗?),以及它按元素运算(即Nx1向量bsx-与自身相乘产生Nx1向量,乘以转置但产生NxN矩阵)。
请参阅https://mathworks.com/help/matlab/ref/bsxfun.html
用作 bsxfun(@times,a,a')