R 用NA进行稀疏矩阵乘法

R 用NA进行稀疏矩阵乘法,r,matrix,sparse-matrix,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

如果数据中存在
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)
我们得到了不同的结果

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时,是否有任何方法可以使稀疏矩阵乘法始终产生与密集矩阵乘法相同的结果(当然,除了转换为密集形式之外,这会首先破坏使用稀疏矩阵的目标)

更新

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

以下所有结果对我来说都是一样的:

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
得到的结果,我从
m1%*%m2
得到的结果与你的不同。您确定复制了正确的矩阵吗?同上^。我不能复制这个。。。两者给出的结果相同output@RichardScriven我只是将这段代码复制并粘贴到一个新的R会话中,得到了相同的结果。我也会将m1和m2的内容粘贴到问题中,以再次检查我们是否有相同的矩阵。无论哪种方式,问题仍然成立,因为对于
Matrix(data=0,sparse=T)%*%NA
r,这是否值得提出-devel@r-org和/或Ping Martin Mächler(
maintainer(“矩阵”)
)?相关的:
sm1 %*% sm2