如何解决今天在 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 举报,一经查实,本站将立刻删除。