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