【发布时间】:2019-04-21 16:36:01
【问题描述】:
我想计算向量 G 和数组 C 的每一行之间的欧几里得距离,同时将每一行除以向量 GSD 中的一个值。我所做的似乎非常效率低下。我最大的开销是什么? 我可以加快速度吗?
m=1E7;
G=1E5*rand(1,8);
C=1E5*[zeros(m,1),rand(m,8)];
GSD=10*rand(1,8);
%I've taken the log10 of the values because G and C are very large in magnitude.
%Don't know if it's worth it.
for i=1:m
dG(i,1)=norm((log10(G)-log10(C(i,2:end)))/log10(GSD));
end
使用下面的示例,它们并没有给出相同的答案。事实上,他们都没有给出相同的答案(见下图使用:
dG = pdist2(log10(G),log10(C(:,2:end)),'mahalanobis',diag(log10(GSD))); %(1)
dG = sqrt(sum((log10(G)-log10(C(:,2:end))./log10(GSD)).^2,2));
tmp=bsxfun(@rdivide,bsxfun(@minus,log10(G),log10(C(:,2:end))),log10(GSD)); %(4)
dG = sqrt(sum(tmp.^2,2));
【问题讨论】:
-
这三个中哪一个给出的答案与您自己的代码相同?我猜想 Mahalanobis 是错误的,但我没有立即看出其他两个有什么不同。
-
另外,您在取数据的对数时确实会更改数学。我不明白你为什么这样做,为什么你认为你在计算欧几里得距离。我不会在你的代码中使用
log10。 -
@CrisLuengo G 是一些实验数据,GSD 是 G 中每个点的标准偏差。C 是通过尝试不同的参数值从数学模型预测 G。我想找到一个参数值,使 C 中的一行最小化 C 和 G 之间的差异,这考虑了标准偏差的影响。所以我想我应该记录日志,以防数量级存在差异。你怎么看?
-
好吧,请注意
log(std(x))~=std(log(x)),所以我认为您的标准化不再正确。如果你想计算数据的对数的欧几里得距离,那很好,但是先取对数,然后归一化,或者先归一化,然后取对数。你什么都不做。通常,归一化(白化)应该处理数量级的差异。另请注意log(G)-log(C) = log(G./C),想想这对您的数据意味着什么!
标签: matlab