13

我正在寻找有关 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 中矢量化循环的例子。我想学习如何做,并自己做。

4

3 回答 3

8

以下是我经常链接到的一些 MathWorks 教程作为该主题的参考:

这是 Loren 的一篇博客文章,其中对特定示例问题的代码向量化进行了很好的演练:

您作为样本给出的特定类型的问题,涉及处理给定矩阵的子矩阵,可以根据您正在执行的操作以不同的方式进行矢量化。您可以使用CONV2FILTER2代替嵌套的 for 循环。Image Processing Toolbox中还有许多函数可以处理矩阵的邻域和块处理,例如NLFILTERBLOCKPROC。这些函数的文档应该可以帮助您弄清楚如何将它们用作向量化代码的一种方式。

于 2010-05-19T17:37:27.903 回答
3

一年前我写了一篇小文章,解释了我在每天编写 Matlab 代码 3 年后发现的一个技巧,经常花费太多时间对所有内容进行矢量化。

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

主要思想是,只需将代码沿一维向量化,您就可以获得很长的路要走。你们中的一些人可能已经发现了这个技巧,但我认为它值得被称为 Matlab 设计模式。

于 2011-04-26T20:27:53.200 回答
1

经验法则是,您应该尽可能使用对数组进行操作的内置 matlab 函数来代替循环。例如,在我看来,您描述的问题可以表述为卷积,然后您可以使用 matlabconv2()filter()函数来实现它而无需循环。

另一个通用技巧是尝试根据矩阵运算来制定您的问题。

您还应该更喜欢以空间换时间。假设您有一个 n 维向量v和一个 mxn 矩阵M,其中每一行也是一个 n 维向量。假设您想要 的v每一行之间的欧几里得距离M。在这种情况下,您应该使用repmat()创建一个包含 m 个副本的矩阵v,并使用不循环的元素数组操作计算距离。

于 2010-05-19T17:40:27.410 回答