我试图找到一些方法来运行这个脚本,但是它需要花费大量的时间来处理,所以我决定尝试“矢量化”它们,但没有成功。
B = sparse(NxNy,NxNy)
Ny=246;
Nx=190;
for n1y = 1:Ny
for n1x = 1:Nx;
n1 = (n1y-1)*Nx+n1x;
for n2y = 1:Ny
for n2x = 1:Nx;
n2 = (n2y-1)*Nx+n2x;
dx12 = xax(n1x) - xax(n2x);
dy12 = xay(n1y) - xay(n2y);
r12 = sqrt(dx12^2+dy12^2);
B(n1,n2) = 0.8 * exp((-1/2)*(r12/300));
end
end
end
end
我试图对n1y,n1x,n2y和2nx进行矢量化,但是当Matlab处理向量时,不能执行不同大小的向量(计算n1和n2),所以,我停止了。
尺寸(xax)= 190
size(xay)= 246
答案 0 :(得分:1)
通过将循环更改为矩阵运算,我能够将内循环的时间从0.027秒减少到0.00046秒
此外,如果从循环中取出距离计算,则有5%的改进。
减少第二个内循环会将时间从0.11秒改为0.0065秒。
close all; clear all;
Nx=190;
Ny=246;
xax = unidrnd(10, [1,Nx]);
xay = unidrnd(10, [1,Ny]);
B = sparse(Nx * Ny, Nx * Ny);
dx2 = repmat(xax, length(xax), 1);
dy2 = repmat(xay, length(xay), 1);
dx2 = (dx2 - dx2').^2 / 90000;
dy2 = (dy2 - dy2').^2 / 90000;
n1x = 1:Nx;
n2x = 1:Nx;
for n1y = 1:Ny
Y1 = (n1y-1)*Nx;
for n2y = 1:Ny
tic
Y2 = (n2y-1)*Nx;
DY = dy2(n1y, n2y);
n1 = Y1 + n1x;
n2 = Y2 + n2x;
r12 = sqrt(dx2 + DY);
B(n1,n2) = 0.8 * exp((-1/2)*(r12));
toc
end
end