具有数值公差的向量矢量匹配
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有数值公差的向量矢量匹配相关的知识,希望对你有一定的参考价值。
我正在尝试将数字向量中的值与一组离散值进行匹配,但是由于舍入误差,它们不一定是精确匹配。考虑以下示例,将球面坐标转换为笛卡尔坐标,并尝试将结果距离与原始r值进行匹配,
phithetar <- expand.grid(theta=seq(0,pi,length=10),
phi = seq(0, 2*pi, length=10),
r = seq(1,10))
xyz <- transform(phithetar, x = r*sin(theta)*cos(phi),
y = r*sin(theta)*sin(phi),
z = r*cos(theta))
xyz <- transform(xyz, newr = sqrt(x^2+y^2+z^2))
with(xyz, sum(newr != r))
这是非零值,因为运算会导致精度损失。
这是我的慢速实现,用于匹配给定公差内的值; x上的迭代使其变慢。一种替代方法是扩展所有(x,y)组合,但是对于大向量而言,这会占用大量内存。
match_closest <- function(x, y, tol=1e-5)
match_one <- function(.x)
difs <- abs(.x - y)
best <- which.min(difs)
if(difs[best] > tol) message(.x, " ain't so close to ", y[best])
y[best]
vapply(x, match_one, 0)
rvalues <- unique(phithetar$r)
xyz <- transform(xyz, matchedr = match_closest(newr, rvalues))
with(xyz, sum(matchedr != r))
我用cut()
尝试了另一个想法,
match_closenough <- function(x, y, tol=1e-5)
levs <- c(y-0.5*tol, y+0.5*tol)
f <- cut(x, breaks=levs, include.lowest = TRUE)
y[f]
但效果不佳。同样,此舍入技巧
match_closenough <- function(x, y, tol=1e-3)
dig <- -log10(tol)
y[match(round(x, dig), round(y, dig), nomatch = NA)]
一种作品,速度更快,但感觉太脆弱了。
答案
尝试all.equal
。参数tolerance
确定您要允许多少偏差。
以上是关于具有数值公差的向量矢量匹配的主要内容,如果未能解决你的问题,请参考以下文章