附帶倍頻的幫助文件有這個條目:
19.1基本矢量
要一個很好的第一近似,在量化目標是避免迴路,並使用全陣列 寫代碼操作。作爲 簡單的例子,考慮
for i = 1:n
for j = 1:m
c(i,j) = a(i,j) + b(i,j);
endfor
endfor
相比要簡單得多
c = a + b;
這不僅是更容易編寫;它在內部也更容易優化。 Octave將此操作委託給底層的 實現,除其他優化外,可能會使用特殊向量 硬件指令,或者甚至可能會在並行中執行添加操作。一般來說,如果代碼是矢量化的,那麼爲了實現更快的執行,底層的 實現具有更多的自由,這些假設可以在 中做出。
這對於「廉價」機構的循環尤其重要。通常它只需向最內層循環矢量化即可獲得可接受的性能。一般的經驗法則是 向量化主體的「順序」應該大於或等於 封閉循環的「順序」。
作爲以下簡單的例子,而不是
for i = 1:n-1
a(i) = b(i+1) - b(i);
endfor
寫入
a = b(2:n) - b(1:n-1);
這說明有關使用陣列來 索引,而不是遍歷索引變量的重要一般概念。 索引表達式。 也慷慨地使用布爾索引。如果需要測試條件 ,則此條件也可以寫爲布爾值 索引。舉例來說,代替
for i = 1:n
if (a(i) > 5)
a(i) -= 20
endif
endfor
寫入
a(a>5) -= 20;
其中利用了 '> 5' 產生一個布爾索引的事實。
儘可能地使用元素向量運算符來避免循環 (運算符如'。*'和'。^')。 算術操作。對於簡單的 內聯函數,'vectorize'函數可以自動執行此操作。
- 內置功能:矢量化(FUN) 通過替換的「」,「/」等 所有出現,與」創建內聯函數FUN的向量化版本。「」 ./」等
This may be useful, for example, when using inline functions with
numerical integration or optimization where a vector-valued
function is expected.
fcn = vectorize (inline ("x^2 - 1"))
=> fcn = f(x) = x.^2 - 1
quadv (fcn, 0, 3)
=> 6
See also:  inline,  formula,
 argnames.
還利用在這些的elementwise運營商既 避免循環和不必要的中間存儲器分配廣播。
廣播。
如果可能,請使用內置和庫函數。內置和 編譯功能非常快。即使使用m文件庫函數, 很可能已經被優化,或者將在未來的發行版中更多地優化 。
舉例來說,甚至比
a = b(2:n) - b(1:n-1);
更好的是
a = diff (b);
大多數倍頻功能與矢量和陣列參數在 記寫的。如果你發現自己用一個非常簡單的操作編寫了一個循環, 可能就是這樣一個函數已經存在了。經常出現在量化代碼以下 功能:
指數操縱
* find
* sub2ind
* ind2sub
* sort
* unique
* lookup
* ifelse/merge
重複
* repmat
* repelems
矢量化運算
* sum
* prod
* cumsum
* cumprod
* sumsq
* diff
* dot
* cummax
* cummin
形狀更高維數組
* reshape
* resize
* permute
* squeeze
* deal
也期待在從斯坦福ML維基上的例子多一些指導這些頁面。
http://ufldl.stanford.edu/wiki/index.php/Vectorization
http://ufldl.stanford.edu/wiki/index.php/Logistic_Regression_Vectorization_Example
http://ufldl.stanford.edu/wiki/index.php/Neural_Network_Vectorization
你能提供一個鏈接到上GLM講座? – justis 2012-02-21 19:57:23
致謝Andrew Ng在斯坦福大學的ML課程:http://cs229.stanford.edu/materials.html - GLM和Softmax迴歸材料可在第1講結尾處找到 – oort 2012-02-21 23:32:54