不使用循环的成对evlaluation

时间:2013-12-10 16:52:35

标签: matlab loops bsxfun

我有一个N x 1阵列A,并希望得到结果矩阵,其中元素是对A(i)和&对上的函数f(例如max)的评估。 A(j)(i,j = 1,...,N)。结果矩阵看起来像[f(A(i),A(j))]。任何人都有建议不使用循环来实现这一目标?也更好地避免使用bsxfun,因为在某些程序中没有实现bsxfun。 TKS

2 个答案:

答案 0 :(得分:1)

使用meshgridarrayfun

[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

答案 1 :(得分:0)

如果您不想要循环而没有bsxfun,则会留下repmat

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