附带倍频的帮助文件有这个条目:
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