稀疏矩阵乘法与 NA

dww*_*dww 5 r matrix sparse-matrix

如果数据中有 ,则NA对R 中的稀疏矩阵执行矩阵乘法会产生与对相同矩阵的密集形式执行的相同操作不同的结果。

一些数据来证明:

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)
Run Code Online (Sandbox Code Playgroud)

现在如果我们这样做

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
Run Code Online (Sandbox Code Playgroud)

我们得到不同的结果

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
Run Code Online (Sandbox Code Playgroud)

造成这种情况的原因似乎是 while0 * NA返回时NA,稀疏矩阵中的零(或缺失位置)在乘以 NA 时返回零。

我们可以看到这种行为

0 %*% NA
     [,1]
[1,]   NA

Matrix(data=0, sparse=T) %*% NA
1 x 1 Matrix of class "dgeMatrix"
     [,1]
[1,]    0
Run Code Online (Sandbox Code Playgroud)

当数据中可能存在 NA 时,是否有任何方法可以使稀疏矩阵乘法始终产生与密集矩阵乘法相同的结果(当然,除了转换为它们的密集形式,这会破坏在第一名)?

更新

评论表明,不同的人会看到各种不同的行为。我已经在 64 位 Linux (kubuntu 16.04)、R 3.2.3、Matrix 1.2-3R 3.3.1、Matrix 1.2-6 上进行了测试。

以下对我来说都是相同的结果:

m1 %*% m2
as.matrix(m1) %*% as.matrix(m2)
as.matrix(sm1) %*% as.matrix(sm2)
Run Code Online (Sandbox Code Playgroud)

然而

sm1 %*% sm2
Run Code Online (Sandbox Code Playgroud)

给出不同的值,如上所示。当矩阵包含Inf或时,会出现类似的差异NaN

——

然而,@user20650 看到了略微不同的行为,他在评论中报告说他们在 Ubuntu 14.04 (x32)、Matrix v1.2-6、R v3.3.1 上也看到了不同的结果,但对我来说是不同的组合。在他们的情况下,m1 %*% m2sm1 %*% sm2都给出了与我相同的答案sm1 %*% sm2。但是,as.matrix(m1) %*% as.matrix(m2)as.matrix(sm1) %*% as.matrix(sm2)这两个得到的结果为我得到m1 %*% m2