попарная оценка без использования цикла

У меня есть массив A N x 1, и я хочу получить результирующую матрицу с элементами, являющимися оценкой функции f (например, max) для пар A (i) и A (j) (i, j = 1,..., Н). Результирующая матрица будет иметь вид [f(A(i), A(j))]. У кого-нибудь есть предложения по достижению этого без использования цикла? Также лучше избегать bsxfun, так как bsxfun не реализован в некоторых программах. ТКС


person yliueagle    schedule 10.12.2013    source источник
comment
Поместите код с петлями в свой вопрос. Прямо сейчас я действительно понятия не имею, что вы надеетесь получить на выходе.   -  person KitsuneYMG    schedule 10.12.2013
comment
результат = нули (N, N); для i, j = 1: N, результат (i, j) = f (A (i), A (j))   -  person yliueagle    schedule 10.12.2013


Ответы (2)


Используйте meshgrid и arrayfun:

[ii jj ] = ndgrid(1:N, 1:N); %// generate all combinations of i and j
result = arrayfun(@(n) f(A(ii(n)), A(jj(n))), 1:N^2); 
result = reshape(result, length(A)*[1 1]); %// reshape into a matrix

Пример:

N = 3;
A = [4 5 2];
f = @(x,y) max(x,y);

>>[ii jj ] = ndgrid(1:N, 1:N);
result = arrayfun(@(n) f(A(ii(n)), A(jj(n))), 1:N^2);
result = reshape(result, length(A)*[1 1])

result =

     4     5     4
     5     5     5
     4     5     2
person Luis Mendo    schedule 10.12.2013

Если вам не нужны циклы и нет bsxfun, вам остается repmat

ra = repmat( A, [1 size(N,1)] );
res = f( ra, ra' ); % assuming f can be vectorized over matrices
person Shai    schedule 10.12.2013