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;