Векторизованный код - PullRequest
       6

Векторизованный код

1 голос
/ 19 марта 2012

Мне не совсем понятен векторизационный подход к matlab, в основном из-за простых примеров, приведенных в документации, и я надеюсь, что кто-то поможет мне понять его немного лучше.

Итак, что я?Я пытаюсь выполнить выборку NxN из матрицы ncols x nrows x ielements, вычислить среднее значение для каждого элемента и сохранить максимальное из средних значений.Если использовать циклы for, код будет выглядеть следующим образом:

for x = 1+margin : nrows-margin
    for y = 1+margin : ncols-margin
        for i=1:ielem
           % take a NxN sample 
           sample = input_matrix(y-margin:y+margin,x-margin:x+margin,i)
           % compute the average of all elements
           result(i) = mean2(sample);
        end %for i
      % store the max of the computed averages
      output_matrix(y,x)=max(result);
      end %for y
  end %for x

Кто-нибудь может сделать хорошую векторизацию этого примера ситуации?T

1 Ответ

2 голосов
/ 19 марта 2012

Прежде всего, векторизация не так важна, как это было раньше, из-за улучшений в компиляции кода до его запуска, но это все еще очень распространенная практика и может привести к некоторым улучшениям. Старая версия Matlab выполнялась по одной строке за раз, что оставляло бы цикл for намного медленнее, чем векторизованная версия того же кода.

Часть вашей матрицы, которая может быть векторизована, является внутренним циклом more for. Я покажу простой пример того, что вы пытаетесь сделать, я позволю вам взять пример и вставить его в свой код.

input=randn(5,5,3);
max(mean(mean(input,1),2))

По существу, внутренние два mean принимают среднее значение входного массива, а внешнее max найдет максимальное значение в диапазоне. Если вы хотите, вы можете разбить его шаг за шагом, и посмотреть, что он делает. mean(input,1) будет принимать среднее значение по первому измерению, mean(input,2) - по второму и т. Д. После того, как первые два средних значения выполнены, остается только вектор, с которым функция max легко сработает. Следует отметить, что размер вектора pre-max составляет [1 1 3], размеры сохраняются при выполнении этой операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...