将5D矩阵与2D矩阵相乘

时间:2011-12-19 17:03:32

标签: matlab matrix vectorization dot-product

我有一个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矩阵的更快方法吗?

2 个答案:

答案 0 :(得分:3)

首先要注意的是,在最里面的循环中,你执行9次点积,每次都覆盖H(:,ikx,iky,ikz)。这没有意义。您应该在循环中填写n 的随机值,并在循环之后计算H(:,ikx,iky,ikz)

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

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

函数SQUEEZE用于从H中删除单个维度,这将使其成为N×N×N-Nz矩阵。

答案 1 :(得分:1)

您可以使用某些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])