Получение индекса элемента в spfun, cellfun, arrayfun и т. Д. В MATLAB - PullRequest
12 голосов
/ 12 октября 2011

Есть ли способ получить index элемента, на котором действует функция, вызванная cellfun, arrayfun или spfun? (то есть получить индекс элемента в рамках функции).

Ради простоты представьте, что у меня есть следующий пример игрушки:

S = spdiags([1:4]',0,4,4)
f = spfun(@(x) 2*x,S)

, которая строит разреженную диагональную матрицу 4x4, а затем умножает каждый элемент на 2.

И скажем, что теперь вместо умножения каждого элемента на постоянное число 2 я бы хотел умножить его на индекс, который элемент имеет в исходной матрице , т.е. предполагая, что linear_index содержит индекс для каждого элемента, это будет что-то вроде этого:

S = spdiags([1:4]',0,4,4)
f = spfun(@(x) linear_index*x,S)

Однако обратите внимание, что приведенный выше код не работает (linear_index не объявлен).

Этот вопрос частично мотивирован тем фактом, что blocproc дает вам доступ к block_struct.location, который, как можно утверждать, ссылается на местоположение (~ index) текущего элемента в пределах full объект (изображение в данном случае):

block_struct.location: Двухэлементный вектор [row col], который определяет положение первого пикселя (минимальная строка, минимальная колонка) блокировать данные во входном изображении.

Ответы [ 3 ]

7 голосов
/ 12 октября 2011

Нет, но вы можете указать линейный индекс в качестве дополнительного аргумента.

И cellfun, и arrayfun принимают несколько входных массивов. Таким образом, например, arrayfun, вы можете написать

a = [1 1 2 2];
lin_idx = 1:4;
out = arrayfun(@(x,y)x*y,a,lin_idx);

К сожалению, это не работает с spfun, поскольку он принимает только один вход (разреженный массив).

Вместо этого вы можете использовать arrayfun, например:

S = spdiags([1:4]',0,4,4);
lin_idx = find(S);

out = spones(S);
out(lin_idx) = arrayfun(@(x,y)x*y,full(S(lin_idx)),lin_idx);
%# or
out(lin_idx) = S(lin_idx) .* lin_idx;

Обратите внимание, что вызов full не вызовет проблем с памятью, поскольку S(lin_idx) равен 0%.

2 голосов
/ 12 октября 2011

Можно создать разреженную матрицу с заполнением linear_index вместо значений.

Создать A:

A(find(S))=find(S)

Затем использовать A и S без spfun, например:A.*S.Это работает очень быстро.

1 голос
/ 25 марта 2015

Все просто.Просто создайте ячейку, например: C = num2cell (1: length (S));затем: out = arrayfun (@ (x, c) c * x, S, C)

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