2014-01-16 39 views
0

我試圖找到一些方法來運行這個腳本,但它需要大量的處理時間,所以我決定嘗試「矢量化」它們,但不成功。如何在matlab中將這幾個循環向量化?

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

大小(XAY)= 246

+0

給出xax,xay和B的大小。你在循環之前初始化了B =零(b1,b2)嗎? – divanov

+0

對不起,我忘了,xax(1,190)和xay(1,246) 我用稀疏函數初始化B: B =稀疏(NxNy,NxNy) –

+0

也在(n2y-1)之後加分號* Nx + n2x - 輸出到控制檯顯着減慢執行速度。 – divanov

回答

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 
+0

令人難以置信!它節省了一個非常好的時間,你有什麼其他想法來減少執行時間嗎? –

+0

儘可能多地在循環之外。 – divanov

+0

好的,謝謝你的時間,你的想法非常有用。 –