Применить функцию к каждой паре столбцов в двух матрицах в MATLAB - PullRequest
3 голосов
/ 22 марта 2012

В MATLAB я хотел бы применить функцию к каждой паре векторов столбцов в матрицах A и B. Я знаю, что должен быть эффективный (не for) способ сделать это, но я не могу понять это. Функция выведет скаляр.

Ответы [ 2 ]

7 голосов
/ 22 марта 2012

Попробуйте

na = size(A,1);
nb = size(B,1);
newvector = bsxfun(@(j,k)(func(A(j,:),B(k,:))),1:na,(1:nb)');

bsxfun выполняет одноэлементное расширение для 1: na и (1: nb) '. Конечным результатом, в этом случае, является то, что func будет применяться к каждой паре векторов столбцов, взятых из A и B.

Обратите внимание, что bsxfun может быть сложным: для этого может потребоваться, чтобы прикладная функция поддерживала одноэлементное расширение. В этом случае все будет работать так, как вы хотите.

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

Вы имеете в виду попарно?Таким образом, в цикле for функция будет работать как scalar_val = func(A(i),B(i))?

Если A и B имеют одинаковый размер, вы можете применить ARRAYFUN функцию:

newvector = arrayfun(@(x) func(A(x),B(x)), 1:numel(A));

ОБНОВЛЕНИЕ :

В соответствии с вашим комментарием вам нужно запустить все комбинации A и B как scalar_val = func(A(i), B(j)).Это немного сложнее, и для больших векторов можно быстро заполнить память.

Если ваша функция одна из стандартных, вы можете попробовать использовать BSXFUN :

out = bsxfun(@plus, A, B');

Другой способ - использовать MESHGRID и ARRAYFUN:

[Am, Bm] = meshgrid(A,B);
out = arrayfun(@(x) func(Am(x),Bm(x)), 1:numel(Am));
out = reshape(out, numel(A), numel(B));

Я считаю, что это должно сработать, но у меня нет времени проверять это сейчас.

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