2017-08-08 106 views
3

MATLAB索引約定考慮以下兩個向量的預分配:爲載體/ 1D陣列

vecCol = NaN(3, 1); 
vecRow = NaN(1, 3); 

現在的目標是值(如果矢量無法例如內的循環)分配給那些載體。是否有關於索引的約定或最佳做法?

建議採用以下方法嗎?

for k = 1:3 
    vecCol(k, 1) = 1; % Row, Column 
    vecRow(1, k) = 2; % Row, Column 
end 

還是更好的代碼如下?

for k = 1:3 
    vecCol(k) = 1; % Element 
    vecRow(k) = 2; % Element 
end 

回答

6

它使在功能上沒有區別。如果上下文意味着向量始終是1D(在本例中您的命名約定有幫助),那麼您可以使用vecCol(i)以獲得簡潔和靈活性。然而,也有一些優勢,使用vecCol(i,1)語法:

  • 很明確清楚你正在使用哪種類型的載體。這很重要,如果它很重要,例如當使用線性代數時,如果方向是任意的,可能無關緊要。
  • 如果你忘了初始化(壞,但它發生),那麼這將確保按預期
  • 這是一個好習慣進入所以使用二維數組
  • 這似乎當你別忘了方向稍微快一點。這對於小陣列來說可以忽略不計,但對於帶有10^8元素的矢量,請參見下面的基準,並且速度提高> 10%。

    function benchie() 
    % Benchmark. Set up large row/column vectors, time value assignment using timeit. 
        n = 1e8; 
        vecCol = NaN(n, 1); vecRow = NaN(1, n); 
        f = @()fullidx(vecCol, vecRow, n); 
        s = @()singleidx(vecCol, vecRow, n); 
        timeit(f) 
        timeit(s) 
    end 
    function fullidx(vecCol, vecRow, n) 
    % 2D indexing, copied from the example in question 
        for k = 1:n 
         vecCol(k, 1) = 1; % Row, Column 
         vecRow(1, k) = 2; % Row, Column 
        end 
    end 
    function singleidx(vecCol, vecRow, n) 
    % Element indexing, copied from the example in question 
        for k = 1:n 
         vecCol(k) = 1; % Element 
         vecRow(k) = 2; % Element 
        end 
    end 
    

    輸出(在Windows 64位R2015b測試,您的里程可能會有所不同!)

    % f (full indexing): 2.4874 secs 
    % s (element indexing): 2.8456 secs 
    

    遍歷這個基準上增加n,我們可以生產以供參考下面的情節。

    enter image description here

4

編程中的一般規則是「顯式優於隱式」。由於兩者之間沒有功能上的差異,我會說這取決於上下文哪一個是清潔劑/更好:

  • 如果上下文使用了大量的矩陣代數和行和列向量之間的區別重要的是,使用2個參數的索引,以減少錯誤,並有助於閱讀

  • 如果上下文不disciminate兩者之間的多,你僅僅使用向量作爲簡單數組,使用1參數索引是清潔