【问题标题】:Vectorize 2D 3D matrix product for speedup向量化 2D 3D 矩阵乘积以加快速度
【发布时间】:2015-10-21 22:24:14
【问题描述】:

我有以下设置

matrix2D_1 = zeros(40,191);
matrix2D_2 = zeros(40,191);
matrix3D_1 = zeros(40,191,191);
for j = 1:40
    for jw = 1:191
        matrix2D_1(j,jw)  = sum(squeeze(matrix3D_1(j,jw,:))'*matrix2D_2' );
    end
end

所以我想要 3D 矩阵的第 3 维的所有乘积与第一个 2D 矩阵的元素的总和,这是矩阵乘积

squeeze(matrix3D_1(j,jw,:))'*matrix2D_2'

然后将这些结果的总和存储在第一个二维矩阵中。 由于我必须在一个大循环中运行它,这在我的代码中花费的时间最多。我无法理解如何以更优雅的方式对其进行矢量化。任何更快的解决方案将不胜感激......

【问题讨论】:

    标签: performance matlab matrix vectorization matrix-multiplication


    【解决方案1】:

    是的!使用matrix-multiplicationreshape 魔法-

    M = size(matrix2D_1,2);
    matrix2D_1 = reshape(sum(reshape(matrix3D_1,[],M)*matrix2D_2.',2),[],M)
    

    或者sum 然后matrix-multiplication -

    matrix2D_1 = reshape(reshape(matrix3D_1,[],M)*sum(matrix2D_2,1).',[],M)
    

    【讨论】:

    • 谢谢,我想我知道你想如何解决它,但它给出了错误,因为size( reshape(matrix3D_1,[],40)) 是 36481,40 而size(matrix2D_2') 是 191,40...
    • @horseshoe 我在没有40 的情况下使代码通用。再检查一下?
    • 是的,完美,现在它可以工作了,而且比我的旧版本快得多。非常感谢
    • 在我的代码中:--->旧版本:经过的时间是 0.242785 秒。 --->新版本:经过时间为0.008497秒。第三个更快... -->0.063
    • @horseshoe 非常棒!这确实是一个巨大的加速!
    猜你喜欢
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多