0
function [D] = distChiSq( W, X )
%%% find the  Chi2Dist distance between each weight vector and X
% W is nxd
m = size(W,1);  n = size(X,1);
k = size(W,2);
mOnes = ones(1,m); D = zeros(m,n);
for i=1:n
    Xi = X(i,:);  XiRep = Xi( mOnes, : );
    s = XiRep + W;                        /************/
    d = XiRep - W;                        /************/
    D(:,i) = sum( d.^2 ./ (s+eps), 2 );   /************/
end
D = D/2;

これは、重み行列とデータの間の Chi2 距離計算の一部です。マークされた行は、すべてのコードの中で最も消費量の多い行です。MATLAB でより高速に実行する方法はありますか?

データがnxmの場合s = nxm, d = nxm、Dは距離を保っています。n はインスタンス数、m は変数数です。

4

2 に答える 2

5

ああ、これはでとても楽しいです:

s = bsxfun( @plus, permute( X, [1 3 2] ), permute( W, [3 1 2] ) ) + eps;
d = bsxfun( @minus, permute( X, [1 3 2] ), permute( W, [3 1 2] ) ).^2;
D = .5*sum( d./s, 3 );
于 2013-06-14T16:01:03.757 に答える
2

Shaiからの素晴らしい答えの代替:

F = @(a,b) (a-b).^2 ./ (a+b+eps);
D = sum(bsxfun(F, permute(X, [3 1 2]), permute(W, [1 3 2])), 3)/2;
于 2013-06-14T16:11:50.687 に答える