matlab - 计算范围广泛的标量值的矩阵乘积
问题描述
假设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
循环?
解决方案
问题是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 节省时间和内存?
推荐阅读
- substrate - 如何将 AccountId 转换为 Vec
或相反亦然 - matlab - Matlab中如何将离散信号转为连续信号
- python - 如何在 Mac 上安装 TensorFlow 对象检测?
- php - 使用单个域部署多个 Laravel 应用程序
- swift - 按“忘记此设备”如何知道我的蓝牙设备已被删除?
- powershell - 重定向命令行输出
- javascript - Javascript正则表达式,匹配长度限制之前的所有单词
- javascript - 如何将突出显示的元素传递给 popup.js 文件,以便我可以对其进行操作以进行更改
- c++ - 带有示例代码的 OpenCV C++ 读取访问冲突
- reactjs - 在功能组件中单击时仅更新子项