MATLAB:在向量和向量数组之间进行均方根误差的最快方法
Posted
技术标签:
【中文标题】MATLAB:在向量和向量数组之间进行均方根误差的最快方法【英文标题】:MATLAB: fastest way to do a root-mean-squared error between a vector and array of vectors 【发布时间】:2011-11-29 19:58:54 【问题描述】:我有一个关于计算单个向量和向量数组之间 RMSE 的最快方法的问题。具体来说,我有一个表示一个点的向量 A,并且想在 A 最接近的点的列表 B 中找到索引。现在我正在使用:
tempmat = bsxfun(@minus,A,B);
tempmat1 = sqrt(sum(tempmat.^2,2);
index = find(tempmat1 == min(tempmat1));
计算索引大约需要 0.058 秒。 MATLAB中有没有更快的方法来做到这一点?我实际上执行了数百万次这种计算。
非常感谢您的阅读, 乔
【问题讨论】:
A 是一个 [x,y,z] 向量,B 是一个数组,每一行都是一个 [x,y,z] 向量。不知何故,它并没有通过格式。 【参考方案1】:tempmat = bsxfun(@minus,A,B);
tmpmat1 = sum(tempmat.^2,2);
[m,index] = min(tempmat1);
m = sqrt(m); %# optional, only if you need the actual numerical value
这避免了在整个数组上计算sqrt
,因为平方差的最小值将具有相同的索引。它还使用min
的第二次输出来避免find
的第二次传递。
【讨论】:
酷,不知道为什么我以前没看到!这提供了大约 15% 的速度增加。我可以使用任何其他 MATLAB 功能吗,或者就是这样?我意识到这是一个非常基本的计算,所以我觉得我的列表的大小是限制因素。 我喜欢@Nzbuu 的建议(***.com/a/8318513/120261)。在你的情况下,我想它会是A(ones(1, size(B,1)),:) - B
。可能较慢,但值得一试,因为谁知道 Matlab,是 repmat(A, size(B,1), 1) - B
。不过,更有可能的是,您需要查看程序的整体结构,看看是否有机会缓存先前的结果或其他东西。如果您迫切希望加快这一特定操作,您可以用 C 语言编写一个 MEX 文件并从 Matlab 中调用它。
MEX 文件可能是可行的操作。这个操作或多或少是我程序的症结所在,就像是援助被调用了数百万次。向量 A 每次迭代都会改变,所以我认为在这种情况下没有办法缓存任何结果。
前段时间有一个关于距离的问题,提到了 kd-trees (***.com/a/2815279/120261)。您可能会发现 B 的某种预处理可以让您更直接地计算最小距离。【参考方案2】:
你可能会发现
tempmat = A - B(ones(1, size(A,1)), :)
比bsxfun
版本快,除非 size(A,1) 非常大。
这假设 A 是您的数组,B 是您的向量。 RSS 计算意味着您有行向量。
另外,我想你知道你计算的是 RSS 而不是 RMS。
【讨论】:
你缺少一个结束括号。以上是关于MATLAB:在向量和向量数组之间进行均方根误差的最快方法的主要内容,如果未能解决你的问题,请参考以下文章