Matlab "arrayfun" функция - PullRequest
       3

Matlab "arrayfun" функция

1 голос
/ 18 марта 2011

Рассмотрим следующую функцию, которая принимает серое изображение (2D матрица) в качестве входных данных:

function r = fun1(img)
r = sum(sum(img));

Я подумываю использовать arrayfun для обработки серии изображений (3d матрица), таким образомустраняя необходимость в цикле for:

arrayfun(@fun1, imgStack);

Но arrayfun пытается обработать каждый элемент imgStack как вход для fun1, результат предыдущей операции также является трехмернымматрица.Как я могу сообщить arrayfun, что я хочу повторить fun1 только в 3-м измерении imgStack?

Другой вопрос, arrayfun вызывает ли fun1 параллельно?

Ответы [ 2 ]

5 голосов
/ 18 марта 2011

В этом случае вам не нужен arrayfun для выполнения ваших вычислений, вы можете просто сделать это:

imgStack = rand( 10, 10, 4 ); % 4 10x10 images
r = sum( sum( imgStack, 1 ), 2 ); % sum along both dimensions 1 and 2

В общем, множество операций MATLAB будут работать сразу над всем массивом, то естьобычный способ избежать циклов.

Обычный MATLAB " arrayfun " не параллелен.Однако для GPUArrays (с Parallel Computing Toolbox) существует параллельная версия arrayfun .

0 голосов
/ 18 марта 2011

На ваш первый вопрос: вы можете попробовать для этого обвинения.Одно предложение

function ds = applyfun_onfirstdim(arr, h_fun)

dimvec = size(arr);
indexarr = repmat( (1:dimvec(1))', [1, dimvec(2:end)] );

ds = accumarray(indexarr(:), arr(:), [], h_fun);

Это создает вспомогательный индекс-массив тех же размеров, что и входной "arr".Каждый фрагмент, к которому вы хотите применить h_fun, получает один и тот же индекс.В этом примере это первый.

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