2012-10-25 52 views
4

在學習了Java中的基本編程之後,我發現在我當前的算法過程中轉換到MatLab中最困難的部分是避免循環。我知道有很多聰明的方法可以在MatLab中對操作進行矢量化處理,但是我的思想被循環思考「困住」,我發現很難直觀地看到我如何矢量化代碼。一旦我看到如何做到這一點,這對我來說是有道理的,但是我自己並不那麼容易看到它。目前,我有尋找在拉格朗日插值使用的重心權重如下代碼:避免MatLab代碼中的循環(重心權重)

function w = barycentric_weights(x); 
% The function is used to find the weights of the 
% barycentric formula based on a given grid as input. 

n = length(x); 
w = zeros(1,n); 

% Calculating the weights 
for i = 1:n 
    prod = 1; 
    for j = 1:n 
     if i ~= j 
      prod = prod*(x(i) - x(j)); 
     end 
    end 
    w(i) = prod; 
end 
w = 1./w; 

我敢肯定,必須有在MATLAB中做到這一點更聰明的方式,但我想不出它。如果有人有任何提示,我將非常感謝:)。在MatLab中學習所有向量化技巧的唯一方法就是看看它們在諸如上面的各種場景中如何使用。

回答

2

我可以看到矢量化的吸引力,但我經常問自己,一個月後,當我回到代碼並且必須破譯所有repmat亂碼時,它實際上節省了多少時間。我認爲你現在的代碼是乾淨清晰的,除非性能真的很重要,否則我不會惹它。但在這裏回答你的問題是我的盡最大努力:

function w = barycentric_weights_vectorized(x) 
    n = length(x); 
    w = 1./prod(eye(n) + repmat(x,n,1) - repmat(x',1,n),1); 
end 

希望幫助!

而我假設x這裏是一個行向量。

+0

非常感謝!非常感謝您的意見。 Java對我來說更直觀,我猜:) – Kristian

3

一個人必須在MATLAB創新,以避免循環:

[X,Y] =meshgrid(x,x) 
Z = X - Y 
w =1./prod(Z+eye(length(x))) 
+0

非常感謝您的輸入。我真的很感激:) – Kristian

3

克里斯蒂安,有辦法向量化代碼很多。你已經得到了兩個。 (我同意shakinfree:你應該總是考慮1)以非矢量化的形式運行需要多長時間(所以你可以知道通過矢量化可以節省多少時間); 2)你可能需要多長時間進行矢量化(這樣你才能更好地瞭解它是否值得你花時間; 3)你會多少次稱呼它(值得這樣做);和3)可讀性。正如shakinfree所建議的那樣,您不希望一年後再回到您的代碼,並且對您實施的內容感到頭疼。至少要確保你的評論很好。

但是在元級別,當您決定需要通過向量化來提高運行時性能時,首先從小型(3x1?)數組開始,並確保您準確理解每次迭代發生的情況。然後,花一些時間閱讀本文件,並按照相關鏈接:

http://www.mathworks.com/help/releases/R2012b/symbolic/code-performance.html

它會幫助你決定何時以及如何量化。

快樂MATLABbing!

Brett

+0

非常感謝您的意見,Brett。我很感激!我也必須同意,閱讀經過大量矢量化處理的MatLab代碼往往令人困惑,難以形象化。在Java上花了三個月之後,我可以閱讀很長的代碼段並理解每一步,因爲編程語言非常清晰直觀。我現在已經花了六個月的時間與MatLab合作,並且在他們包含許多矢量化技巧時,我仍然無法閱讀其他人編寫的代碼。有時候我真的希望MatLab能更快地使用循環,所以我可以堅持下去! – Kristian