X、Y 和 z 是表示表面的坐标。为了计算一些量,我们称之为流,在表面的 i,j 点,我需要计算所有其他点 (i0,j0) 的贡献。为此,我需要例如知道点 i0、j0 和所有其他点 (alpha) 之间的角度 cos。然后来自 i0,j0 的所有贡献必须乘以一些常数并相加。zv0 在每个点 i,j 是最终需要的结果。
我想出了下面写的一些代码,它似乎非常不合适。首先,它减慢了程序的其余部分,并且似乎使用了所有可用内存。我的系统有 4gb 物理内存和 12gb 交换文件,它总是内存不足,尽管所有变量大小都不大于 10kb。请帮助解决加速/矢量化和内存问题。
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;