Introduction to vectorizing in MATLAB - any good t

2019-01-13 14:35发布

问题:

I'm looking for any good tutorials on vectorizing (loops) in MATLAB.

I have quite simple algorithm, but it uses two for loops. I know that it should be simple to vectorize it and I would like to learn how to do it instead of asking you for the solution.

But to let you know what problem I have, so you would be able to suggest best tutorials that are showing how to solve similar problems, here's the outline of my problem:

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

So, I'm NOT asking for the solution. I'm asking for a good tutorials, examples of vectorizing loops in MATLAB. I would like to learn how to do it and do it on my own.

回答1:

Here are a couple of MathWorks tutorials I often link to as references on the subject:

  • Code Vectorization Guide
  • Techniques for Improving Performance: Vectorizing Loops

And here's one of Loren's blog posts that has a nice walkthrough of code vectorization for a particular sample problem:

  • Speeding Up MATLAB Applications

The particular type of problem you gave as a sample, which involves processing submatrices of a given matrix, could be vectorized in different ways depending greatly on what sort of operation you are doing. You may be able to use CONV2 or FILTER2 instead of your nested for loops. There are also a number of functions in the Image Processing Toolbox that handle neighborhood and block processing of matrices, such as NLFILTER and BLOCKPROC. The documentation for these functions should help you figure out how to use them as a way to vectorize your code.



回答2:

There's a little writeup that I did a year ago to explain a trick that I found after having spent 3 years writing Matlab code daily, often spending too much time vectorizing everything.

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

The main idea is that you can get a long way just by vectorizing your code along one dimension. Some of you might have already discovered that trick, but I think it's worth being called a Matlab design pattern.



回答3:

The rule of thumb is that you should use built-in matlab functions that operate on arrays in place of loops whenever possible. For example, it seems to me that the problem you've described can be formulated as a convolution, and then you can use matlab's conv2() or filter() functions to implement it without the loop.

Another general trick is to try to formulate your problem in terms of matrix operations.

You should also prefer trading space for time. Let's say you have an n-dimensional vector v and an m x n matrix M, where every row is also an n-dimensional vector. Let's say you want the Euclidean distances between v and every row of M. In this case you should use repmat() to create a matrix containing m copies of v, and calculate the distances using element-wise array operations without a loop.