为什么这种矢量化矩阵比较失败了?

时间:2013-12-30 22:15:51

标签: r matrix comparison vectorization

我试图将矩阵的第一行与同一矩阵的所有行进行比较。但是矢量化比较并没有返回正确的结果。任何可能发生这种情况的原因?

m <- matrix(c(1,2,3,1,2,4), nrow=2, ncol=3, byrow=TRUE)

> m
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1    2    4

> # Why does the first row not have 3 TRUE values?
> m[1,] == m
      [,1]  [,2]  [,3]
[1,]  TRUE FALSE FALSE
[2,] FALSE FALSE FALSE

> m[1,] == m[1,]
[1] TRUE TRUE TRUE

> m[1,] == m[2,]
[1]  TRUE  TRUE FALSE

后续即可。在我的实际数据中,我有大量的行(至少1000万)然后时间和内存加起来。以下建议的其他建议由其他人提出?

m <- matrix(rep(c(1,2,3), 1000000), ncol=3, byrow=TRUE)

> #by @alexis_laz
> m1 <- matrix(m[1,], nrow = nrow(m), ncol = ncol(m), byrow = T)
> system.time(m == m1)
   user  system elapsed 
   0.21    0.03    0.31

> object.size(m1)
24000112 bytes

> #by @PaulHiemstra
> system.time( t(apply(m, 1, function(x) x == m[1,])) )
   user  system elapsed 
  35.18    0.08   36.04 

后续行动2 。 @alexis_laz你是对的。我想比较每一行,并在其上发布了一个后续问题(How to vectorize comparing each row of matrix with all other rows

2 个答案:

答案 0 :(得分:4)

在比较m[1,] == m中,第一个词m[1,]被循环使用(一次),等于m的长度。然后按列完成比较。

您将c(1,2,3)c(1,1,2,2,3,4)进行比较,将c(1,2,3,1,2,3)c(1,1,2,2,3,3,4)进行比较,这样您就有一个TRUE后跟五个FALSE(和打包为矩阵以匹配m)的维度。

答案 1 :(得分:2)

正如@MatthewLundberg指出的那样,R的回收规则并不像你预期的那样。在我看来,明确说明要比较什么并且不依赖于R的假设总是更好。一种做出正确比较的方法:

t(apply(m, 1, function(x) x == m[1,]))
     [,1] [,2]  [,3]
[1,] TRUE TRUE  TRUE
[2,] TRUE TRUE FALSE

或:

m == rbind(m[1,], m[1,])
     [,1] [,2]  [,3]
[1,] TRUE TRUE  TRUE
[2,] TRUE TRUE FALSE

或让R的recyling对你有利(感谢@Arun):

t(t(m) == m[1,])
     [,1] [,2]  [,3]
[1,] TRUE TRUE  TRUE
[2,] TRUE TRUE FALSE