假设a
是1 x n
向量,b
是n x 1
向量,A
是n x n
矩阵,并且{{1} }是xx
向量。我想计算m x 1
,其计算方法如下:
fxx
这当然可以,但是感觉这是一个非常慢的方法,是否有更好的内置方法来处理这种for i = 1:m
fxx(i)=a*expm(xx(i)*A)*b;
end
循环?
答案 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?