微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从 R 中的外部函数创建一个稀疏矩阵?

如何解决如何从 R 中的外部函数创建一个稀疏矩阵?

在我的代码中,外部函数输出一个矩阵。是否有可能使输出稀疏矩阵?我可以将这个输出矩阵转换为一个稀疏矩阵,但我想做一些类似 outer(......,sparse=T) 的事情,而不是先有密集矩阵然后再转换。因为我有非常大的数据。我的代码和简短的示例向量如下。我已阅读所有相关帖子,但无法弄清楚。

# myvec is a vector of length 100. 
# mycol is a column vector of length 10.

myvec <- c( 0,1,2,3,3)


mycol <- c(-15.07,-7.64,-15.48,-18.59,-12.35,-10.44,-11.45,-18.49,-15.24,-13.23)   
 
res <- outer(1:length(mycol),1:length(mycol),function(i,j) {
               ifelse(myvec > 1,ifelse(myvec == 1,(mycol[j]-mycol[i])/(1-exp(-(mycol[j]-mycol[i]))),ifelse(myvec ==0,myvec)))})

我还尝试使用行、列、值三元组从头开始创建一个稀疏矩阵,我的代码如下。但是因为条目 (resvec) 长度是 100,所以创建了稀疏矩阵,但只使用对角线的前 10 个条目,其余的非对角线元素为零。但我想将所有 100 个条目都写入它们的位置。

非常感谢。

resvec<- as.vector(res)

matSparse <- sparseMatrix(
  i = 1:length(mycol),j = 1:length(mycol),x = resvec,dims = c(length(mycol),length(mycol)),dimnames = list(rownames,colnames)
)

ps:行名和列名相同。

解决方法

类似这样的事情,我只是重做 outer 所做的事情,但只是针对产生非零结果的 myvec 值。您可以稍微简化函数 f,也可以将其设为 myvec 的函数。

f <- function(i,j) {
  ifelse(myvec > 1,ifelse(myvec == 1,(mycol[j]-mycol[i])/(1-exp(-(mycol[j]-mycol[i]))),ifelse(myvec ==0,1,myvec)))}

library(Matrix)
i <- rep(1:length(mycol),times = length(mycol))[myvec < 2]
j <- rep(1:length(mycol),each = length(mycol))[myvec < 2]
myvec <- myvec[myvec < 2]
sparseMatrix(i,j,x = f(i,j))
#> 10 x 10 sparse Matrix of class "dgCMatrix"
#>                                                                                                                 
#>  [1,] 1.000000000  7.434410 1.000000000 .          2.9118151 4.675609 .          1.0000000 0.91740717 .         
#>  [2,] 0.004409999  1.000000 0.003087581 .          1.0000000 .        0.08629586 .         .          0.02095708
#>  [3,] 1.218969243  .        .           0.14518433 .         .        .          0.1560604 .          1.00000000
#>  [4,] .           10.950192 3.255184331 1.00000000 6.2521909 .        .          .         .          5.38531586
#>  [5,] 0.191815105  .        1.000000000 0.01219087 .         2.241996 .          0.0132598 0.17006693 0.62371549
#>  [6,] .            2.981293 .           .          0.3319956 .        0.57859728 .         .          .         
#>  [7,] .            .        0.072926774 .          1.0000000 1.588597 1.00000000 .         0.08761709 0.36106528
#>  [8,] .            .        .           .          6.1532598 1.000000 7.04617334 .         1.00000000 .         
#>  [9,] 1.087407174  .        0.884795398 0.12180607 3.0600669 .        .          0.1310995 .          .         
#> [10,] .            5.610957 .           .          .         2.972579 2.14106528 1.0000000 0.31098581 .

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。