首页 > 解决方案 > 计算范围广泛的标量值的矩阵乘积

问题描述

假设a是一个1 x n向量,b是一个n x 1向量,A是一个n x n矩阵,xx是一个m x 1向量。我想计算fxx可以计算如下:

for i = 1:m
    fxx(i)=a*expm(xx(i)*A)*b;
end

这当然有效,但感觉这是一种非常慢的方法,是否有更好的内置方法来处理这种类型的for循环?

标签: matlabmatrixoptimizationmatrix-multiplication

解决方案


问题是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

虽然我怀疑它会以这种方式为您节省大量时间。与您的代码相比,主要的加速是 preallocate fxx,就像我所做的那样,因为这样可以节省 MATLAB 在每次循环迭代时分配和取消分配您的数组。


在您的评论中,您说这m通常非常大。如果是这种情况,parfor如果您拥有并行计算工具箱,可能会对您有所帮助。在这种情况下,预先计算 3D 矩阵可能不起作用,因为它在 RAM 中会非常大,所以只需使用:

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

有关如何为parfor您提供帮助的更多信息,以及正确切片变量时如何更快地进行切片,请参阅以下问题:使用 parfor 节省时间和内存?


推荐阅读