2017-10-21 70 views
0

我在matlab中編碼,由於matlab不能很好地處理「for」循環,所以我需要避免它們,以便儘可能快地完成。這是我處理「for」的代碼的一部分。避免用於矩陣計算的循環

for i = 1:size(U,1) 
    for j=1:size(U,2)   
     v(i,j) = U(mod(i+1-1,size(U,1))+1,j) + U(i,mod(j+1-1,size(U,2))+1) ... 
       + U(mod(i-1-1,size(U,1))+1,j) + U(i,mod(j-1-1,size(U,2))+1) - 4*U(i,j); 
    end 
end 

我的矩陣中存在一個週期邊界條件,這就是爲什麼我使用「mod」函數。 這段代碼實際上類似於matlab中的「del2」函數,但是matlab版本不能處理週期邊界條件。使用meshgrid

+3

請解釋你的意思是matlab與「for」循環無法很好地工作 –

+0

@BradDay如果你使用了太多的「for」循環,並且你用另一種語言編寫相同的代碼,它可以增加仿真的運行時間像C++編程它會更快。無論如何,我正在尋找像「for」這樣的循環結構的替代方案,就是這樣... – aaa

+0

嗯。我沒有看到這種方法可以在沒有迭代過程的情況下完成,因爲您需要查看拉普拉斯算子的U(i,j)的鄰居。如果matlab執行代碼太慢,我可以建議的唯一方法是嘗試使用[parfor]的並行for循環(https://www.mathworks.com/help/distcomp/parfor.html) –

回答

0

矢量化版本:

[n,m] = meshgrid(1:size(U,2),1:size(U,1)); 
v = U(sub2ind(size(U),mod(m,size(U,1))+1,n)) + U(sub2ind(size(U),m,mod(n,size(U,2))+1)) ... 
    + U(sub2ind(size(U),mod(m-2,size(U,1))+1,n)) + U(sub2ind(size(U),m,mod(n-2,size(U,2))+1)) - 4.*U; 

你也可以加快循環(可能是由多個數量級)的preallocating memory。在這種情況下,只需將

v = zeros(size(U)); 

在循環前面。