计算各种标量值的矩阵乘积

时间:2018-09-13 08:28:26

标签: matlab matrix optimization matrix-multiplication

假设a1 x n向量,bn x 1向量,An x n矩阵,并且{{1} }是xx向量。我想计算m x 1,其计算方法如下:

fxx

这当然可以,但是感觉这是一个非常慢的方法,是否有更好的内置方法来处理这种for i = 1:m fxx(i)=a*expm(xx(i)*A)*b; end 循环?

1 个答案:

答案 0 :(得分:2)

问题在于expm仅适用于2D矩阵,因此您需要在2D切片上调用它。可能加快速度的唯一一点就是将xx*A预计算为3D矩阵:

n=5;
m=10;
a = rand(1,n);
b = rand(n,1);
A = rand(n,n);
xx = rand(m,1);

tmp = bsxfun(@times,permute(xx,[3 2 1]),A); % Pre-calculate the matrix multiplication

fxx = zeros(m,1);
for ii = 1:m
    fxx(ii) = a*expm(tmp(:,:,m))*b;
end

尽管我怀疑这样会节省您很多时间。与您的代码相比,主要的提速方法是像我所做的那样预先分配fxx,因为这样可以节省MATLAB在每次循环迭代时分配和取消分配数组的时间。


在您的评论中,您指出m通常很大。在这种情况下,如果您拥有并行计算工具箱,parfor可能会为您提供帮助。在这种情况下,可能无法使用预先计算3D矩阵的方法,因为它在RAM中会很大,因此只需使用:

fxx=zeros(m,1);
parfor ii = 1:m
    fxx(ii) = a*expm(xx(ii)*A)*b;
end

有关parfor如何为您提供帮助以及在正确切片变量时如何更快地提供更多信息,请参见以下问题:Saving time and memory using parfor?