2

Nx、Ny、および Nz が入力として与えられる 5D 行列 Cij(3,3,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行列を取得するより速い方法を知っている人はいますか?

4

2 に答える 2

3

最初に、最も内側のループ内で内積を 9 回実行し、H(:,ikx,iky,ikz)毎回上書きすることに注意してください。それには意味がありません。n ループ内でランダムな値を入力し、そのループのH(:,ikx,iky,ikz)に1 回計算する必要があります。

ただし、関数DOTがベクトル化され、5 次元配列を処理できるという事実を利用できるため、すべてのループは不要です(つまり、最初の非 1 次元でドット操作を自動的に実行します)。n複素数の 3 x 3 x Nx x Ny x Nz 行列を作成するだけです。これらの 2 行で、上記のコードと同じ結果が得られるはずです。

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

関数SQUEEZEは、 から単一次元を削除するために使用されHます。これにより、3 x Nx x Ny x Nz の行列になります。

于 2011-12-19T17:23:02.583 に答える
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])
于 2011-12-19T17:25:23.210 に答える