检查矩阵行是否等于R中的向量,进行向量化

时间:2015-09-17 22:03:21

标签: r matrix vector vectorization

我很惊讶这个问题没有被问到,也许答案会清楚为什么。我想比较矩阵的行和向量,并返回行==向量到处。请参阅下面的示例。我想要一个矢量化解决方案,没有应用函数,因为矩阵对于慢循环来说太大了。假设还有很多行,所以我想避免重复使用向量。

set.seed(1)

M = matrix(rpois(50,5),5,10)

v = c(3 ,   2 ,   7  ,  7 ,   4   , 4   , 7  ,  4  ,  5, 6)

M
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    4    8    3    5    9    4    5    6    7     7
[2,]    4    9    3    6    3    1    5    7    6     1
[3,]    5    6    6   11    6    4    5    2    7     5
[4,]    8    6    4    4    3    8    3    6    5     6
[5,]    3    2    7    7    4    4    7    4    5     6

输出应为

FALSE  FALSE FALSE FALSE TRUE

3 个答案:

答案 0 :(得分:7)

一种可能性是

rowSums(M == v[col(M)]) == ncol(M)
## [1] FALSE FALSE FALSE FALSE  TRUE

或者类似地

rowSums(M == rep(v, each = nrow(M))) == ncol(M)
## [1] FALSE FALSE FALSE FALSE  TRUE

colSums(t(M) == v) == ncol(M)
## [1] FALSE FALSE FALSE FALSE  TRUE

v[col(M)]只是rep(v, each = nrow(M))的缩短版本,可以创建与M大小相同的向量(矩阵只是一个向量,尝试c(M)),然后比较每个使用==对应其相应的元素。幸运的是,==是一个通用函数,它具有array方法(请参阅methods("Ops")is.array(M)),它允许我们运行rowSums(或colSums )以确保我们的匹配数量为ncol(M)

答案 1 :(得分:4)

使用DeMorgan的规则(Not not = Some not),然后All equal = Not Some Not equal,我们也有

!colSums(t(M) != v)

答案 2 :(得分:0)

prodlim有一个名为row.match的功能,它易于使用,非常适合您的问题。首先安装并加载库:library(prodlim)。在我们的示例中,row.match将返回' 5'因为M中的第5行等于v。然后我们可以将其转换为逻辑向量。

m <- row.match(v, M)
m==1:NROW(M)#[1] FALSE FALSE FALSE FALSE  TRUE