如何从 R 中的外部函数创建稀疏矩阵?
How can create a sparse matrix out of outer function in R?
在我的代码中,外部函数输出一个矩阵。是否可以使输出稀疏矩阵?我可以将这个输出矩阵转换为稀疏矩阵,但我想做一些类似 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)))})
我还尝试使用行、列、值三元组从头开始创建稀疏矩阵,我的代码如下。但是因为条目 (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, 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 .
在我的代码中,外部函数输出一个矩阵。是否可以使输出稀疏矩阵?我可以将这个输出矩阵转换为稀疏矩阵,但我想做一些类似 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)))})
我还尝试使用行、列、值三元组从头开始创建稀疏矩阵,我的代码如下。但是因为条目 (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, 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 .