首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >矩阵%中的矩阵%

矩阵%中的矩阵%
EN

Stack Overflow用户
提问于 2011-10-30 15:02:58
回答 5查看 994关注 0票数 14

假设我有两个矩阵,每个矩阵有两列,行数不同。我想要检查并查看一个矩阵的哪些对在另一个矩阵中。如果这些是一维的,我通常只会做a %in% x来得到我的结果。match似乎只对向量起作用。

代码语言:javascript
复制
> a
      [,1] [,2]
[1,]    1    2
[2,]    4    9
[3,]    1    6
[4,]    7    7
> x
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10

我希望结果是c(FALSE,TRUE,TRUE,FALSE)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-10-30 17:05:09

另一种方法是:

代码语言:javascript
复制
> paste(a[,1], a[,2], sep="$$") %in% paste(x[,1], x[,2], sep="$$")
[1] FALSE  TRUE  TRUE FALSE

更通用的版本是:

代码语言:javascript
复制
> apply(a, 1, paste, collapse="$$") %in% apply(x, 1, paste, collapse="$$")
[1] FALSE  TRUE  TRUE FALSE
票数 10
EN

Stack Overflow用户

发布于 2011-10-30 15:21:05

重新创建数据:

代码语言:javascript
复制
a <- matrix(c(1, 2, 4, 9, 1, 6, 7, 7), ncol=2, byrow=TRUE)
x <- matrix(c(1, 6, 2, 7, 3, 8, 4, 9, 5, 10), ncol=2, byrow=TRUE)

定义一个类似于%in%的矩阵函数%inm%

代码语言:javascript
复制
`%inm%` <- function(x, matrix){
  test <- apply(matrix, 1, `==`, x)
  any(apply(test, 2, all))
}

将此应用于您的数据:

代码语言:javascript
复制
apply(a, 1, `%inm%`, x)
[1] FALSE  TRUE  TRUE FALSE

要比较单行,请执行以下操作:

代码语言:javascript
复制
a[1, ] %inm% x
[1] FALSE

a[2, ] %inm% x
[1] TRUE
票数 11
EN

Stack Overflow用户

发布于 2011-10-30 17:09:32

Andrie的解决方案非常好。但是如果你有很大的矩阵,你可能想尝试其他的东西,基于递归。如果您按列工作,则可以通过排除第一个位置不匹配的所有内容来减少计算时间:

代码语言:javascript
复制
fastercheck <- function(x,matrix){
  nc <- ncol(matrix)
  rec.check <- function(r,i,id){
    id[id] <- matrix[id,i] %in% r[i]
    if(i<nc & any(id)) rec.check(r,i+1,id) else any(id)
  }
  apply(x,1,rec.check,1,rep(TRUE,nrow(matrix)))
}

对比:

代码语言:javascript
复制
> set.seed(100)
> x <- matrix(runif(1e6),ncol=10)
> a <- matrix(runif(300),ncol=10)
> a[c(3,7,9,15),] <- x[c(1000,48213,867,20459),]
> system.time(res1 <- a %inm% x)
   user  system elapsed 
  31.16    0.14   31.50 
> system.time(res2 <- fastercheck(a,x))
   user  system elapsed 
   0.37    0.00    0.38 
> identical(res1, res2)
[1] TRUE
> which(res2)
[1]  3  7  9 15

编辑:

我检查了被接受的答案,只是为了好玩。比double apply执行得更好(因为您去掉了内部循环),但递归仍然是规则!;-)

代码语言:javascript
复制
> system.time(apply(a, 1, paste, collapse="$$") %in% 
 + apply(x, 1, paste, collapse="$$"))
   user  system elapsed 
   6.40    0.01    6.41 
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7943695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档