1

X、Y、z は面を表す座標です。いくつかの量を計算するために、それをフローと呼びましょう。サーフェスのポイント i,j で、他のすべてのポイント (i0,j0) からの寄与を計算する必要があります。そのためには、たとえば、ポイント i0、j0 と他のすべてのポイント (アルファ) の間の角度の cos を知る必要があります。次に、i0、j0 からのすべての寄与をいくつかの定数で乗算して加算する必要があります。すべての点 i,j での zv0 は、最終的に必要な結果です。

私は以下に書かれたいくつかのコードを思いつきましたが、それは非常に不適切なようです。まず第一に、プログラムの残りの部分が遅くなり、使用可能なメモリをすべて使用しているように見えます。私のシステムには 4 GB の物理メモリと 12 GB のスワップ ファイルがあり、すべての変数のサイズが 10 kb を超えていませんが、常にメモリが不足しています。高速化/ベクトル化とメモリの問題を解決してください。

parfor i0=2:1:length(x00);
  for j0=2:1:length(y00);
    zv=red3dfunc(X0,Y0,f,z0,i0,j0,st,ang,nx,ny,nz);
    zv0=zv0+zv;
  end
end


function[X,Y,z,zv]=red3dfunc(X,Y,f,z,i0,j0,st,ang,Nx,Ny,Nz)
x1=X(i0,j0);
y1=Y(i0,j0);
z1=z(i0,j0);
alpha=zeros(size(X));
betha=zeros(size(X));
r=zeros(size(X));
XXa=X-x1;
YYa=Y-y1;
ZZa=z-z1;
VEC=((XXa).^2+(YYa).^2+(ZZa).^2).^(1/2);
VEC(i0,j0)=VEC(i0-1,j0-1);
XXa=XXa./VEC;
YYa=YYa./VEC;
ZZa=ZZa./VEC;
alpha=-(Nx(i0,j0).*XXa+Ny(i0,j0).*YYa+Nz(i0,j0).*ZZa);
betha=Nx.*XXa+Ny.*YYa+Nz.*ZZb;
r=VEC;
zv=(1/pi)*st^2*ang.*f.*(alpha).*betha./r.^2;
4

1 に答える 1

3

これを行うための明白なことは、Kroneker 製品を使用することです。次元 nAxmA および nBxmB の行列の場合、matlab 関数は kron(A,B) です。この関数は次元 (nA*nB)x(mA*mB) の行列を返します。これは次のようになります。

[a11*B a12*B ... a1mA*B;
.......................;
anA1*B ........ anAmA*B]

そのため、1 の行列 I=ones(size(X)) を導入することで問題を解決できる場合があります。次に、XXa、YYa、ZZa、および VEC マトリックスをループなしで次のように定義します。

XXa = kron(I,X)-kron(X,I);
YYa = kron(I,Y)-kron(Y,I);
ZZa = kron(I,Z)-kron(Z,I);
VEC=((XXa).^2+(YYa).^2+(ZZa).^2).^(1/2);

次に、任意の i0、j0 の VEC を次のように見つけます (n と m を X のサイズ コンポーネントとして定義した場合)。

VEC((1+n*(i0-1)):(n*i0),(1+m*(j0-1)):(m*j0))
于 2012-12-06T17:47:15.970 に答える