2013-12-10 2 views
0

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

+1

Переключите кода петли в ваш вопрос. Прямо сейчас, я действительно не знаю, что вы надеетесь получить в качестве выхода. – KitsuneYMG

+0

результат = нули (N, N); для i, j = 1: N, результат (i, j) = f (A (i), A (j)) – yliueagle

ответ

1

Использование 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 
0

Если вы не хотите петли и не bsxfun вы остались с repmat

ra = repmat(A, [1 size(N,1)]); 
res = f(ra, ra'); % assuming f can be vectorized over matrices 
Смежные вопросы