2010-05-19 3 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 

Итак, я m НЕ запрашивать решение. Я прошу хорошие учебные пособия, примеры векторизации циклов в MATLAB. Я хотел бы узнать, как это сделать и сделать это самостоятельно.

ответ

6

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

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

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

+2

Я бы категорически возражал против использования blockproc, если вы можете его избежать - он очень медленный (также он подвергся несовместимому изменению с 2009a по 2009 год). Если у вас достаточно ОЗУ, всегда желательно запускать 'im2col' и применять функцию за один раз. – Jonas

+0

@ Джонас: Приятно знать. Я фактически не использую BLOCKPROC достаточно часто, чтобы столкнуться с этими проблемами. Я просто перечислял его как один из нескольких вариантов, которые OP мог бы рассмотреть. – gnovice

1

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

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

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

3

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

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

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

+0

хороший, спасибо! – Gacek