如何利用R中的外部函数创建稀疏矩阵?

如何利用R中的外部函数创建稀疏矩阵?,r,matrix,sparse-matrix,outer-join,R,Matrix,Sparse Matrix,Outer Join,在我的代码中,外部函数输出一个矩阵。有可能使输出稀疏矩阵吗?我可以将这个输出矩阵转换为稀疏矩阵,但我想做一些类似于outer(…,sparse=T)的事情,而不是先进行密集矩阵,然后再进行转换。因为我有非常大的数据。下面是我的代码和简短的示例向量。我已经读了所有相关的帖子,但还是搞不懂 # myvec is a vector of length 100. # mycol is a column vector of length 10. myvec <- c( 0, 1, 1, 2, 1

在我的代码中,外部函数输出一个矩阵。有可能使输出稀疏矩阵吗?我可以将这个输出矩阵转换为稀疏矩阵,但我想做一些类似于outer(…,sparse=T)的事情,而不是先进行密集矩阵,然后再进行转换。因为我有非常大的数据。下面是我的代码和简短的示例向量。我已经读了所有相关的帖子,但还是搞不懂

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

myvec <- c( 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 1, 0, 2, 1, 2, 1, 3, 2, 2, 1, 0, 1, 2, 1, 0, 2, 1, 2, 1, 3, 2, 2, 1, 0,1, 
          2, 2, 3, 1, 2, 1, 0, 2, 1, 2, 1,0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 1, 0, 2, 1, 2, 1, 3, 2, 2, 1, 0, 1, 2,
          1, 0, 2, 1, 2, 1, 3, 2, 2, 1, 0,1, 2, 2, 3, 1, 2, 1, 0, 2, 1, 2, 1,0, 1, 1, 2, 1, 2, 2, 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, 0, 
                 ifelse(myvec == 1, (mycol[j]-mycol[i])/(1-exp(-(mycol[j]-mycol[i]))), 
                   ifelse(myvec ==0, 1, myvec)))})
myvec是长度为100的向量。 #mycol是长度为10的列向量。
myvec类似这样的东西,我只是重复
outer
所做的事情,但只针对产生非零结果的
myvec
值。您可以将函数
f
简化一点,也许还可以将其作为
myvec
的函数

f <- function(i,j) {
  ifelse(myvec > 1, 0, 
    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 .
f1,0,
如果else(myvec==1,(mycol[j]-mycol[i])/(1-exp(-(mycol[j]-mycol[i])),
ifelse(myvec==0,1,myvec))}
图书馆(矩阵)
i[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
#>  [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 .

我刚刚编辑过,谢谢这能回答你的问题吗?谢谢你的链接,但它对我没有帮助。它起作用了,非常感谢!你能告诉我这些线是干什么的吗;我只是将所有3个向量
i
j
myvec
过滤为
myvec
为0或1的向量(因为它们是矩阵中唯一有条目的向量)。您应该尝试使用
rep
函数来查看它的功能,例如
rep(2,3)
,它可能非常有用。明白了!再次感谢
f <- function(i,j) {
  ifelse(myvec > 1, 0, 
    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 .