今天在 Matlab 中是否有更好的成对马哈拉诺比斯距离计算器

问题描述

对于每个数据点都有自己的协方差矩阵的测量数据,我一直在寻找内置的马氏距离计算器,希望能提高我的软件效率。

查看 pdist2 函数,它将计算马哈拉诺比斯距离,但我只能提供一个协方差矩阵,显然它用于计算每个成对距离。它似乎不允许每个数据点(或数据点对)使用不同的协方差值。(我理解对吗?如果是这样,我看不出它有什么用处。)

我一直在使用 Profiler 来加速测试我的代码。原始代码使用 pdist2 和欧几里得距离。

这段代码有两个嵌套的 for 循环,但允许我提供成对的协方差矩阵。 (仅显示测试部分。)

na = size(a,1);
nb = size(b,1);

D2 = zeros(na,nb);

if na > 1 && nb > 1
    if isequal(a,b)    
        for ia = 1:na
            for ib = ia+1:nb
                if ~isempty(manhattanLimit) && sum(abs(a(ia,:)-b(ib,:))) > manhattanLimit
                    D2(ia,ib) = squareOfAVeryLargedistance;
                    D2(ib,ia) = D2(ia,ib);
                else
                    D2(ia,ib) = mahaldist(a(ia,:),(covA(:,:,ia))+(covB(:,ib)));
                    D2(ib,ib);
                end
            end
        end
    else

这与我从 a post from 2012 获得的函数 mahadist 一起使用:

function D2 = mahaldist(dx,C)

if isrow(dx)
    dx = dx';
end

if isdiag(C)
    D2 = sum(dx.*dx./diag(C));
else

    % Using this answer from StackOverflow:
    %       "Mahalanobis distance inverting the covariance matrix"
    %       https://stackoverflow.com/a/11799356/696042
    %   Relative time is 24.88 vs. 53.77 for direct calculation with x*inv(C)*x'
    %   when called 6,124,012 times.

    L=chol(C); 
    z=L\dx; 
    D2=z'*z; 
end

这比 pdist2(欧几里得)慢 24 倍。如果我没有对 manhattanLimit 或协方差的对角线进行测试,它将运行另一个因子 5.5,或比 pdist2(euclidean) 慢约 132 倍。

在我开始重新发明之前,有没有人知道我应该采取的其他方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)