2010-05-19 53 views
11

我正在寻找任何关于向量化(循环)在MATLAB中的好教程。矢量化MATLAB简介 - 任何好的教程?

我有相当简单的算法,但它使用了两个for循环。我知道,对它进行矢量化应该很简单,我想了解如何去做,而不是要求您提供解决方案。

而是让你知道我有什么问题,这样你就可以认为是展示如何解决类似问题的最好的教程,这里是我的问题的提纲:

B = zeros(size(A)); % //A is a given matrix. 
for i=1:size(A,1) 
    for j=1:size(A,2) 
     H = ... %// take some surrounding elements of the element at position (i,j) (i.e. using mask 3x3 elements) 
     B(i,j) = computeSth(H); %// compute something on selected elements and place it in B 
    end 
end 

所以,我不要求解决方案。我要求一个很好的教程,在MATLAB中矢量化循环的例子。我想学习如何做,并自己做。

回答

6

这里有一对夫妇的MathWorks的教程,我经常链接到作为对象的引用:

而这里的罗兰的博客文章之一,有一个很好的演练针对特定示例问题的代码矢量化:

特定类型的你给作为样本,其中涉及给定矩阵的处理子矩阵的问题,可以在你在做什么样的动作很大,这取决于不同的方式来量化。您可以使用CONV2FILTER2而不是嵌套for循环。处理neighborhood and block processing of matricesImage Processing Toolbox中还有许多功能,例如NLFILTERBLOCKPROC。这些函数的文档应该可以帮助您了解如何将它们用作向量化代码的方式。

+2

我强烈反对使用blockproc,如果你可以避免它 - 这是非常缓慢的(也,它经历了从2009a到2009b不兼容的变化)。如果你有足够的内存,最好运行'im2col'并一次性应用这个函数。 – Jonas 2010-05-20 01:28:44

+0

@Jonas:很高兴知道。我并没有经常使用BLOCKPROC来解决这些问题。我只是把它列为OP可能想要研究的众多选项之一。 – gnovice 2010-05-20 03:54:41

1

经验法则是,您应该使用内置matlab函数,尽可能在数组上操作数组来代替循环。例如,在我看来,你所描述的问题可以被描述为一个卷积,然后你可以使用matlab的conv2()filter()函数来实现它没有循环。

另一个一般的技巧是尝试用矩阵运算来表达你的问题。

您还应该更愿意交易时间空间。假设您有一个n维向量v和一个m×n矩阵M,其中每行也是一个n维向量。假设您想要vM的每一行之间的欧几里德距离。在这种情况下,您应该使用repmat()创建一个包含v的m个副本的矩阵,并使用不带循环的基于元素的数组运算来计算距离。

3

一年前我做了一些小小的写作来解释一个我每天花费3年编写Matlab代码后经常花费太多时间向量化所有东西的技巧。

http://www.gyomalin.com/reasonable_vectorization.html

主要的想法是,你可以仅仅通过沿着一维矢量化代码获得很长的路要走。你们中的一些人可能已经发现了这个技巧,但我认为这值得称为Matlab设计模式。

+0

不错,谢谢! – Gacek 2011-04-26 22:19:13