我有一个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矩阵的方法?
发布于 2011-12-20 01:23:03
首先应该注意的是,在最内层的循环中,您执行了9次点积,每次都会覆盖H(:,ikx,iky,ikz)。这是没有意义的。您只需在循环中填充n的随机值,并在该循环之后计算一次H(:,ikx,iky,ikz)。
但是,所有的循环都是不必要的,因为您可以利用函数DOT是矢量化的,并且可以处理5维数组(即,它将自动在第一个非单元素维度上执行点操作)。您所要做的就是使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中删除单个维度,这将使其成为3xnxxnyxnz矩阵。
发布于 2011-12-20 01:25:23
您可以使用一些reshape (和permute)来做到这一点
C=rand(3,3,Nx,Ny,Nz);
n=rand(3,3);如果你想在n和C的每个元素之间进行mtrix乘法:
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])https://stackoverflow.com/questions/8564784
复制相似问题