具有数值公差的向量矢量匹配

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确定您要允许多少偏差。

以上是关于具有数值公差的向量矢量匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何将具有离散值范围的数值向量转换为因子?

基于具有“容差”的数值向量过滤数据框

R - 子集列表data.frames由矢量值

数值计算矩阵浅析

如何匹配在linq中具有多个用逗号分隔的整数值的列?

矩阵运算:索引逻辑到数值比较的不对称向量