matlab - 转置矩阵的每一行并将结果向量乘以其他矩阵的更快方法?
问题描述
X
我有一个尺寸为 的输入矩阵N_rows x N_cols
。我还有一个稀疏的三对角矩阵M
,其大小为 平方N_rows x N_rows
。这些创建如下:
N_rows = 3;
N_cols = 6;
X = rand(N_rows,N_cols);
mm = 10*ones(N_cols,1); % Subdiagonal elements
dd = 20*ones(N_cols,1); % Main diagonal elements
pp = 30*ones(N_cols,1); % Superdiagonal elements
M = spdiags([mm dd pp],-1:1,N_cols,N_cols);
如下所示:
>> X
X =
0.4018 0.1233 0.4173 0.9448 0.3377 0.1112
0.0760 0.1839 0.0497 0.4909 0.9001 0.7803
0.2399 0.2400 0.9027 0.4893 0.3692 0.3897
full(M)
ans =
2 3 0 0 0 0
1 2 3 0 0 0
0 1 2 3 0 0
0 0 1 2 3 0
0 0 0 1 2 3
0 0 0 0 1 2
我想获取 的每一行X
,并与 进行矩阵乘法M
,然后将获得的行重新组合在一起以获得输出Y
。目前,我通过以下方式成功实现了这一目标:
Y = (M*X.').';
上面的示例是针对 3x6 矩阵X
,但实际上我需要对尺寸为 500 x 500 的矩阵执行此操作,大约 10000 次,并且分析器说此操作在我的较大代码中存在瓶颈。有没有更快的方法来做这个逐行矩阵乘法乘法?
在我的系统上,执行 10000 次大约需要 20 秒:
N_rows = 500;
N_cols = 500;
X = rand(N_rows,N_cols);
mm = 10*ones(N_cols,1); % Subdiagonal elements
dd = 20*ones(N_cols,1); % Main diagonal elements
pp = 30*ones(N_cols,1); % Superdiagonal elements
M = spdiags([mm dd pp],-1:1,N_cols,N_cols);
tic
for k = 1:10000
Y = (M*X.').';
end
toc
Elapsed time is 18.632922 seconds.
解决方案
您可以使用X*M.'
而不是(M*X.').';
. 这在我的计算机上节省了大约 35% 的时间。
这可以解释,因为转置(或置换维度)意味着在矩阵的内部(线性顺序)表示中重新排列元素,这需要时间。
推荐阅读
- spring-boot - Spring Boot Config Client 未从 Config Server 获取属性
- visual-studio-2017 - Visual Studio 2017 失去智能感知
- c# - C# 单元测试在将图像保存到服务器时失败,但应用程序工作正常
- python-3.x - 在 Pandas 中使用 unstack
- java - JPA 不同的内部联接与联接表上的条件
- asp.net - 如何动态地将行添加到我的表中并回发数据以查看
- python - 如何使用尚未声明的类的类型注释函数?
- docker - 设置 docker-compose 以观察多包 golang 项目的变化
- javascript - 从数组返回值时获取未定义 - Node JS
- javascript - 从角度组件将对象传递给自定义装饰器