如何在matlab中对这几个循环进行矢量化?

时间:2014-01-16 16:52:58

标签: matlab vector vectorization

我试图找到一些方法来运行这个脚本,但是它需要花费大量的时间来处理,所以我决定尝试“矢量化”它们,但没有成功。

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

1 个答案:

答案 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