有效地执行向量的元素乘法运算?

时间:2016-12-13 05:06:58

标签: matlab matrix-multiplication

我必须按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是另一个常量。

由于我要通过此函数处理大量数据,是否存在更有效的替代此矩阵更新?

2 个答案:

答案 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.'

MM1相等

答案 1 :(得分:0)

您是否尝试过使用bsxfun?

在任何情况下,bsxfun比常规乘法更快 ,但是矢量/矩阵必须具有相同的长度(它们适合你,不是吗?),以及它按元素运算(即Nx1向量bsx-与自身相乘产生Nx1向量,乘以转置但产生NxN矩阵)。

请参阅https://mathworks.com/help/matlab/ref/bsxfun.html

用作     bsxfun(@times,a,a')