如何在下面的代码中构造一个函数来评估矩阵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 <tol
,tol = 1e-5
。
答案 0 :(得分:3)
首先,由于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)])
结果反映了矢量和矩阵之间找到的匹配数。
答案 1 :(得分: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