Введение в векторизация в 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. Я хотел бы узнать, как это сделать и сделать это самостоятельно.

Ответ 1

Вот несколько руководств MathWorks, на которые я часто ссылаюсь как ссылки на эту тему:

И вот одна из записей в блоге Loren, которая имеет приятное прохождение векторизации кода для конкретной проблемы с образцом:

Конкретный тип проблемы, которую вы дали в качестве образца, который включает в себя обработку подматриц заданной матрицы, может быть векторизован по-разному в зависимости от того, какую операцию вы выполняете. Вы можете использовать CONV2 или FILTER2 вместо ваших вложенных циклов. В Image Processing Toolbox есть несколько функций, которые обрабатывают окрестности и блочную обработку матриц, например NLFILTER и BLOCKPROC. Документация для этих функций должна помочь вам понять, как использовать их в качестве способа векторизации кода.

Ответ 2

Там была небольшая запись, которую я сделал год назад, чтобы объяснить трюк, который я нашел после трех лет написания кода Matlab ежедневно, часто тратя слишком много времени, вектурируя все.

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

Основная идея заключается в том, что вы можете пройти долгий путь, просто вектурируя свой код по одному измерению. Некоторые из вас, возможно, уже обнаружили этот трюк, но я думаю, что его следует называть шаблоном проектирования Matlab.

Ответ 3

Эмпирическое правило состоит в том, что вы должны использовать встроенные функции matlab, которые, когда это возможно, работают на массивах вместо петель. Например, мне кажется, что описанную проблему можно сформулировать как свертку, а затем вы можете использовать функции matlab conv2() или filter() для ее реализации без цикла.

Другой общий трюк - попытаться сформулировать вашу проблему в терминах матричных операций.

Вы также должны предпочесть торговое пространство для времени. Скажем, у вас есть n-мерный вектор v и матрица m x n M, где каждая строка также является n-мерным вектором. Скажем, вы хотите, чтобы евклидовы расстояния между v и каждой строкой M. В этом случае вы должны использовать repmat(), чтобы создать матрицу, содержащую m копий v, и вычислить расстояния, используя элементарные операции массива без цикла.