matlab - 转置矩阵的每一行并将结果向量乘以其他矩阵的更快方法?

标签 matlab loops matrix transpose

我有一个输入矩阵 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.').';

上面的示例是针对 X 的 3x6 矩阵,但实际上我需要对尺寸为 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% 的时间。

这可以解释为因为转置(或排列维度)意味着重新排列矩阵的内部(线性顺序)表示中的元素,这需要时间。

关于matlab - 转置矩阵的每一行并将结果向量乘以其他矩阵的更快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65752460/

相关文章:

matlab - 使用训练图像的可变大小的 pig 描述符训练 SVM (MATLAB)

loops - 映射中键的值会在golang中自动更改

c++ - 递增预处理器宏

numpy - 在 numpy/tensorflow 中向量化不同形状矩阵的乘法

image-processing - 试图理解高斯模糊在 matlab 中的实现

c++ - 读取 16 位 wav 文件并像 Matlab 一样对其进行归一化

algorithm - 给定一个大小为 MxN 且具有正整数值的二维矩阵,找到具有最大和的闭环

javascript - 在 2D 矩阵数组中移动 Sprite - JavaScript

image - Matlab的bwlabel,regionprops & centroid函数解释

c# - 如何迭代两个集合?