【问题标题】:MATLAB: Multiplication of 3d array with 2d matrix and summing them by vectorizationMATLAB:将 3d 数组与 2d 矩阵相乘并通过矢量化对它们求和
【发布时间】:2017-01-04 07:08:11
【问题描述】:

我有一个 2 x 2 矩阵 A = rand(2,2)

我有一个维度为 2 x 2 x 5 的 3d 数组。

叫它T 这样

T(:,:,1) = [1 2;3 4];
T(:,:,2) = [5 6;7 8];
T(:,:,3) = [12 11;10 9];
T(:,:,4) = [13 15;17 19];
T(:,:,5) = [21 22;23 28];

如何进行

的操作
J=zeros(2);
K=zeros(2);
for i = 1:5
  J = J + T(:,:,i)'*A*T(:,:,i);
  K = K + T(:,:,i)'*T(:,:,i);
end

以最快的方式通过矢量化。我想这样做是因为 3d 数组的维度通常非常大。

【问题讨论】:

  • 我不认为这些操作可以进一步向量化。只要确保为结果预先分配内存J=zeros(size(T)); 并运行J(:,:,i) = T(:,:,i)'*A*T(:,:,i); 如果矩阵大小很大,因此循环的每次迭代都需要大量时间,任何进一步的向量化可能不会使更快地编码
  • @Airidas Korolkovas 将它们相加怎么样?
  • 也许你可以通过使用 mtimesx 例程获得一点额外的速度:fr.mathworks.com/matlabcentral/fileexchange/…
  • 请注意,通常“矢量化”=“以更多内存为代价更快”。因此,要么您想以矢量化方式执行此操作,这可能更快,但内存密集度更高,您希望以内存有效的方式执行此操作(您已经是这样了)。

标签: matlab vectorization matrix-multiplication


【解决方案1】:

如果内存允许,这里是一种矢量化方法,它在不同阶段使用矩阵乘法进行归约 -

% Store sizes
[m1,n1] = size(A);
[m2,n2,~] = size(T);

% Perform some matrix-multiplications *magic*
AT2D = reshape(A*reshape(T,m2,[]),m1,n2,[])
T2D = reshape(permute(T,[2,1,3]),n2,[])
Jout = T2D*reshape(permute(AT2D,[1,3,2]),[],n2)
Kout = T2D*T2D.'

【讨论】:

    猜你喜欢
    • 2016-12-11
    • 2017-09-23
    • 1970-01-01
    • 2016-06-03
    • 2020-01-06
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多