【问题标题】:Test if a row of a matrix equals a given vector测试矩阵的一行是否等于给定向量
【发布时间】:2017-03-20 21:14:13
【问题描述】:

如何构造一个函数来评估矩阵mat 的任何行是否等于以下代码中的向量vec

set.seed(000)
mat <- matrix(rnorm(20),4,5)
vec <- c(1.3297993, -0.9285670,  0.7635935, -0.2992151,  0.4356833)
mat[3,]
vec
mat==vec

另外,如何确定至少一个vec 值是否在mat 中?

注意:mat == vec 应该等于TRUE,即mat-vec == 0 如果mat-vec &lt;tol,其中tol = 1e-5

【问题讨论】:

    标签: r matrix vector


    【解决方案1】:

    首先,由于floating point trap(从第 9 页开始),您的示例将无法运行。

    这应该可以解决问题:

    set.seed(000)
    mat <- round(matrix(rnorm(20),4,5), digits = 7)
    vec <- c(1.3297993, -0.9285670,  0.7635935, -0.2992151,  0.4356833)
    

    现在,mat[3, ] == vec 是真的。

    如果你想知道mat的一行是否匹配vec,试试:

    apply(mat, 1, function(x) identical(x, vec))
    

    要确定vec 的至少一个值是否在mat 中,您可以这样做:

    length(vec[which(vec %in% mat)])
    

    结果反映了在向量和矩阵之间找到的匹配数。

    【讨论】:

    • 什么意思,它不起作用?刚刚重新检查过,对我来说很好。
    【解决方案2】:

    类似这样的:

    compare <- function(mat, vec, tol=1e-5)
    {
        ok <- apply(mat, 1, function(v) {
            all(abs(v - vec) < tol)
        })
        any(ok)
    }
    
    
    v <- 1:5
    m <- matrix(rnorm(25), nrow=5)
    compare(m, v)
    # FALSE
    
    m[1,] <- v
    compare(m, v)
    # TRUE
    

    【讨论】:

      猜你喜欢
      • 2015-12-14
      • 1970-01-01
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多