【问题标题】:Ho do I make this code segment faster in matlab?如何在 matlab 中使此代码段更快?
【发布时间】:2013-06-14 14:54:34
【问题描述】:
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 中更快地做到这一点?

如果数据比s = nxm, d = nxm 为nxm,并且D 保持距离。 n 是实例数,m 是变量数。

【问题讨论】:

  • 您是否通过 MATLAB 分析器运行代码?
  • 是的,我已经根据分析器指出了这些线。

标签: performance matlab optimization


【解决方案1】:

哦, 太有趣了:

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 );

【讨论】:

  • 你就是bsxfun,不是吗:)
  • 这肯定很好,但执行速度仍然非常慢。我会选择GPU开发。
  • @Shai,与最初提供的代码相比,您在使用此代码时获得了什么样的加速?我不相信使用bsxfun 而不是+- 会带来任何形式的速度优势。
  • @DangKhoa 我消除了循环。
【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多