Update 2 (解决您更新的问题)
MATLAB 经过优化,可以很好地处理数组。一旦您习惯了它,只需键入一行并让 MATLAB 自行完成完整的 4D 循环工作,而无需担心它,这实际上非常好。 MATLAB 通常用于原型设计/一次性计算,因此为人员编码节省时间并放弃 C[++|#] 的一些灵活性是有意义的。
这就是为什么MATLAB 内部做了some循环得很好- 通常将它们编码为编译函数。
您给出的代码片段并不真正包含执行主要工作的相关代码行,即
% Sort along given dimension
x = sort(x,dim);
换句话说,您显示的代码只需要通过现在排序的多维数组中的正确索引来访问中值x
(这并不需要太多时间)。访问所有数组元素的实际工作是通过sort
,这是一个内置(即编译和高度优化的)函数。
原答案 (关于如何构建自己的在数组上工作的快速函数)
实际上有很多内置函数采用维度参数:min(stack, [], n)
, max(stack, [], n)
, mean(stack, n)
, std(stack, [], n)
, median(stack,n)
, sum(stack, n)
...以及其他内置函数(例如exp()
, sin()
自动处理整个数组的每个元素(即sin(stack)
自动为您执行四个嵌套循环,如果stack
是 4D),您可以构建许多您可能需要的功能,只需依赖现有的内置函数.
如果这对于特定情况还不够,您应该看看repmat http://www.mathworks.de/help/techdoc/ref/repmat.html, bsxfun http://www.mathworks.de/help/techdoc/ref/bsxfun.html, arrayfun http://www.mathworks.de/help/techdoc/ref/arrayfun.html and accumarray http://www.mathworks.de/help/techdoc/ref/accumarray.html这些是非常强大的函数,可以“以 MATLAB 方式”执行操作。只需在 SO 上搜索问题(或者更确切地说是答案)using https://stackoverflow.com/search?q=%5Bmatlab%5D%20repmat one https://stackoverflow.com/search?q=%5Bmatlab%5D%20bsxfun of https://stackoverflow.com/search?q=%5Bmatlab%5D%20arrayfun these https://stackoverflow.com/search?q=%5Bmatlab%5D%20accumarray,通过这种方式,我学到了很多关于 MATLAB 的优点。
As an example,假设您想实施p-norm http://en.wikipedia.org/wiki/Norm_%28mathematics%29#p-norm沿维度的堆栈n
,你可以写
function result=pnorm(stack, p, n)
result=sum(stack.^p,n)^(1/p);
...您可以有效地重用“哪个维度的能力”sum
.
Update
正如马克斯在评论中指出的那样,还可以看看冒号运算符 (:) http://www.mathworks.de/help/techdoc/ref/colon.html这是一个非常强大的工具,用于从数组中选择元素(甚至改变它的形状,这通常是通过reshape http://www.mathworks.de/help/techdoc/ref/reshape.html).
一般来说,看看这个部分数组运算 http://www.mathworks.de/help/techdoc/ref/f16-5872.html#f16-55525在帮助中 - 它包含repmat
等人。上面提到了,而且还cumsum
以及一些更晦涩的辅助函数,您应该将其用作构建块。