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:在向量和向量数组之间进行均方根误差的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

在 MATLAB 中平均大向量的误差

如何用matlab计算样本均值和方差

均方误差(MSE)和均方根误差(RMSE)和平均绝对误差(MAE)

性能度量RMSE

学习向量量化在matlab中效果不佳

算法效果评估:均方根误差(RMSE)/ 标准误差