对R中的稀疏矩阵执行矩阵乘法给出了不同的结果,因为在相同矩阵的密集形式上执行相同的操作如果数据中有NA
要展示的一些数据:
library(Matrix)
set.seed(123)
m1 <- Matrix(data=sample(c(0,0,0,0,0,1,2,NA),25, T), ncol = 5, nrow = 5, sparse = F)
m2 <- Matrix(data=sample(c(0,0,0,0,0,1,2,NA),25, T), ncol = 5, nrow = 5, sparse = F)
sm1 <- Matrix(m1, sparse = T)
sm2 <- Matrix(m2, sparse = T)
现在,如果我们这样做
m1 %*% m2
# 5 x 5 Matrix of class "dgeMatrix"
# [,1] [,2] [,3] [,4] [,5]
# [1,] NA NA NA NA NA
# [2,] 2 NA 0 0 2
# [3,] NA NA NA NA NA
# [4,] NA NA NA NA NA
# [5,] NA NA NA NA NA
我们得到了不同的结果
sm1 %*% sm2
# 5 x 5 sparse Matrix of class "dgCMatrix"
#
# [1,] . NA . . NA
# [2,] 2 NA . . 2
# [3,] . NA NA . 2
# [4,] NA NA . . NA
# [5,] NA NA . . 2
原因似乎是当0 * NA
返回NA
时,稀疏矩阵中的零(或缺少位置)在乘以NA时返回零。
我们可以在
中看到这种行为0 %*% NA
[,1]
[1,] NA
Matrix(data=0, sparse=T) %*% NA
1 x 1 Matrix of class "dgeMatrix"
[,1]
[1,] 0
当数据中可能存在NA时,是否有任何方法可以使稀疏矩阵乘法始终产生与密集矩阵乘法相同的结果(当然,除了转换为密集形式,这会导致密集形式失败首先使用稀疏矩阵的对象)?
更新
评论表明,不同的人会看到各种不同的行为。我已经在R 3.3.1,Matrix 1.2-6上的64位Linux(kubuntu 16.04),R 3.2.3,Matrix 1.2-3,和上进行了测试。
以下所有内容都给我相同的结果:
m1 %*% m2
as.matrix(m1) %*% as.matrix(m2)
as.matrix(sm1) %*% as.matrix(sm2)
而
sm1 %*% sm2
给出不同的值,如上所示。当矩阵包含Inf
或NaN
时,会出现类似的差异。
-
然而,@ user20650看到了略微不同的行为,他们在评论中报告说他们在Ubuntu 14.04(x32),Matrix v1.2-6,R v3.3.1上也看到了不同的结果,但是对我来说有不同的组合。在他们的情况下,m1 %*% m2
和sm1 %*% sm2
都给出了与sm1 %*% sm2
相同的答案。但是,as.matrix(m1) %*% as.matrix(m2)
和as.matrix(sm1) %*% as.matrix(sm2)
都会给出m1 %*% m2
的结果。