我正在寻找关于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中矢量化循环的例子。我想学习如何做,并自己做。
答案 0 :(得分:7)
以下是我经常链接到的几个MathWorks教程,作为该主题的参考资料:
这是Loren的博文之一,它针对特定的示例问题进行了很好的代码矢量化演练:
您作为样本提供的特定类型的问题(涉及处理给定矩阵的子矩阵)可能会以不同的方式进行矢量化,具体取决于您正在执行的操作类型。您可以使用CONV2或FILTER2代替嵌套for循环。 Image Processing Toolbox中还有许多处理neighborhood and block processing of matrices的功能,例如NLFILTER和BLOCKPROC。这些函数的文档应该可以帮助您弄清楚如何将它们用作向量化代码的方法。
答案 1 :(得分:3)
我在一年前写过一篇小文章来解释我在每天花费3年时间编写Matlab代码后发现的一个技巧,经常花费太多时间来渲染所有内容。
http://www.gyomalin.com/reasonable_vectorization.html
主要思想是,只需沿一个维度向量化代码,就可以获得很长的路要走。你们中的一些人可能已经发现了这个技巧,但我认为值得称之为Matlab设计模式。
答案 2 :(得分:1)
经验法则是你应该尽可能使用内置的matlab函数来代替循环操作数组。例如,在我看来,你所描述的问题可以表示为卷积,然后你可以使用matlab的conv2()
或filter()
函数来实现它而不需要循环。
另一个通用技巧是尝试根据矩阵运算来制定问题。
您还应该更喜欢交易空间。假设你有一个n维向量v
和一个m×n矩阵M
,其中每一行也是一个n维向量。假设您希望v
与M
的每一行之间的欧几里德距离。在这种情况下,您应该使用repmat()
创建一个包含m个v
副本的矩阵,并使用没有循环的逐元素数组运算来计算距离。