【问题标题】:Multiply a 5D matrix with a 2D matrix将 5D 矩阵与 2D 矩阵相乘
【发布时间】:2011-12-19 17:03:32
【问题描述】:

我有一个 5D 矩阵 Cij(3,3,Nx,Ny,Nz),其中 Nx,Ny 和 Nz 作为输入给出。

我需要执行以下操作:

for ikx=1:Nx,
    for iky=1:Ny,
        for ikz=1:Nz,

            %Random simulation of fourier components
            n=zeros((3),'double');
            for j=1:9,
                ncomponent=randn(2);
                n(j)=complex(ncomponent(1),ncomponent(2));
                %Calculation of H
                H(:,ikx,iky,ikz)=dot(Cij(:,:,ikx,iky,ikz),n);
            end;
        end;
    end;
end;

问题是增加 Nx,Ny,Nz 循环需要非常长的时间来计算 H 矩阵。

有没有人知道更快的方法来获得 H 矩阵?

【问题讨论】:

    标签: matlab matrix vectorization dot-product


    【解决方案1】:

    首先应该注意的是,在最内层循环中,您执行了 9 次点积,每次都覆盖 H(:,ikx,iky,ikz)。这没有任何意义。您应该在循环中填写n的随机值,然后在该循​​环之后计算H(:,ikx,iky,ikz)

    但是,所有循环都是不必要的,因为您可以利用函数 DOT 是矢量化的并且可以处理 5-D 数组的事实(即,它将自动在第一个非单维上执行点操作) .您所要做的就是使 n 成为一个 3×3×Nx×Ny×Nz 的复数值矩阵。这两行应该给你与上面的代码相同的结果:

    n = complex(rand([3 3 Nx Ny Nz]), rand([3 3 Nx Ny Nz]));
    H = squeeze(dot(Cij, n));
    

    函数SQUEEZE 用于从H 中删除单维,这将使其成为一个 3×Nx×Ny×Nz 矩阵。

    【讨论】:

    • 最终的 H 矩阵必须是 4D ,既不是 5D 也不是 3D。 H 表示由 (Nx,Ny,Nz) 元素组成的空间网格上的 3D 湍流场。因此,从 Cij(3,3,Nx,Ny,Nz) 中,我想得到一个存储湍流场的最终 H(3,Nx,Ny,Nz) 矩阵。预先感谢您,很抱歉给您带来琐碎的问题。
    【解决方案2】:

    您可以使用一些reshape(和permute)来做到这一点

    C=rand(3,3,Nx,Ny,Nz);
    n=rand(3,3);
    

    如果你想在 n 和 C 的每个元素之间进行矩阵乘法:

    H=reshape(n*reshape(C,3,3*Nx*Ny*Nz),[3,3,Nx,Ny,Nz])
    

    如果你想要 n 和 C 的每个元素之间的点积:

    H=reshape(reshape(n,1,[])*reshape(C,3*3,Nx*Ny*Nz),[Nx,Ny,Nz])
    

    【讨论】:

    • 这似乎无法重现嵌套循环中正在执行的操作。
    • 是的,但代码似乎并不是他真正想要做的......他说“类似那样”。正如标题中所说,他的代码不会将 5D 矩阵与 2D 矩阵相乘……我认为他放错了代码的几个部分,j 上的循环应该在开头,而不是与其他部分嵌套。这是我对他想要做什么的猜测。也许我错了……
    • 嗯,我把他的标题解释为有点不对劲,他写的代码给了他正确的答案,但没有他想要的那么快。我想我们将不得不等待,看看他如何回答我们的答案。
    • 大家好,谢谢你们真正的早期回复。可能我没有解释我需要执行什么:我的起始矩阵是 5D Cij(3,3,Nx,Ny,Nz),我想通过将每个子矩阵 Cij(3,3) 与另一个 2D 矩阵 n(3,3) 相乘得到最终的 4D 矩阵 H(3,Nx,Ny,Nz),其中 n 由复数组成,mu= 0.0;和 sigma=1.0;我希望这次能以更好的方式解释我的问题。请耐心等待,我还是matlab新手。
    • 1) 如果你在 Cij(3,3) 和 n(3,3) 之间做点积,那么结果是一个标量,你的最终输出的大小是 H(Nx,Ny,Nz ) 2) 如果您进行矩阵乘法,则结果是一个 3x3 矩阵,因此最终输出的大小为 H(3,3,Nx,Ny,Nz)
    猜你喜欢
    • 2016-12-11
    • 1970-01-01
    • 2021-05-25
    • 2018-07-09
    • 2012-01-31
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多