2012-03-21 1 views
3

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

ответ

7

Попробуйте

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

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

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

+0

Я пробовал то же самое, когда мой func является точечным продуктом, но он дал мне ошибку, поскольку аргументы точки должны быть одинаковыми размер ... Любые идеи, что происходит не так? – Bob

+0

@Bob возможно, что вам нужно вызвать по столбцу, а не по строке: 'bsxfun (@ (j, k) func (A (:, j), A (:, k)), 1: na, (1 : nb) ') 'работает? – Shai

1

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

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

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

UPDATE:

Согласно Вашему комментарию, Вы должны выполнить все комбинации А и В, как 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)); 

Я считаю, что он должен работать, но я не» У меня есть время, чтобы проверить его сейчас.

+0

В цикле for это должно быть 'scalar_val = func (A (i), B (j))' – srubin

Смежные вопросы