sparseMatrix
位于 Matrix
包(package)。 说明
根据非零条目的位置和值,以用户友好方式构造稀疏矩阵(继承自虚拟 class
CsparseMatrix
、 RsparseMatrix
或 TsparseMatrix
)。
建议使用此接口,而不是通过 new("..[CRT]Matrix", ...)
等调用直接构造。
用法
sparseMatrix(i, j, p, x, dims, dimnames,
symmetric = FALSE, triangular = FALSE, index1 = TRUE,
repr = c("C", "R", "T"), giveCsparse,
check = TRUE, use.last.ij = FALSE)
参数
i , j |
长度相等的整数向量,指定矩阵的非零(或非 |
p |
指针的整数向量,每一列(或行)一个,指向列(或行)中元素的初始(从零开始)索引。必须恰好缺少 |
x |
可选,通常为矩阵条目的非零值。如果指定,则长度必须等于 |
dims |
可选的长度为 2 的矩阵维度整数向量。如果丢失,则使用 |
dimnames |
|
symmetric |
逻辑指示结果矩阵是否应该是对称的。在这种情况下, 应仅指定一个三角形(上三角形或下三角形)。 |
triangular |
逻辑指示结果矩阵是否应该是三角形的。在这种情况下, 应仅指定一个三角形(上三角形或下三角形)。 |
index1 |
合乎逻辑的。如果 |
repr |
|
giveCsparse |
(已弃用,已替换为 |
check |
逻辑指示是否在返回之前检查结果是否正式有效。除非您知道自己在做什么,否则请勿设置为 |
use.last.ij |
逻辑指示,在重复(重复)对 |
细节
必须恰好缺少参数 i
、 j
和 p
之一。
在典型用法中,p
缺失,i
和 j
是正整数向量,x
是数值向量。这三个向量必须具有相同的长度,形成稀疏矩阵的三元组表示。
如果i
或j
丢失,则p
必须是第一个元素为零的非递减整数向量。它提供行或列索引的压缩或 “pointer” 表示(以缺失者为准)。 p
、 rep(seq_along(dp),dp)
的扩展形式,其中 dp <- diff(p)
用作(从 1 开始的)行或列索引。
您不能将 singular
和 triangular
同时设置为 true;而是使用Diagonal()
(或其替代方案,请参阅此处)。
i
、 j
、 p
和 index1
的值用于创建基于 1 的索引向量 i
和 j
,从中使用 x
给出的数值构造 TsparseMatrix
,如果不缺失的话。请注意,在这种情况下,当重复某些对 (又名“duplicated”)时,将添加相应的 ,与TsparseMatrix
类的定义保持一致,除非use.last.ij
设置为true。
默认情况下,当 repr = "C"
时,返回从此三元组形式派生的 CsparseMatrix
,其中 repr = "R"
现在允许直接获取 RsparseMatrix
,而 repr = "T"
将结果保留为 TsparseMatrix
。
默认返回 CsparseMatrix
对象而不是三元组格式的原因是,在执行矩阵运算时,压缩列形式更容易使用。特别是,如果 x
中没有零,则 CsparseMatrix
是稀疏矩阵的唯一表示。
值
稀疏矩阵,默认采用压缩稀疏列格式,并且(正式)没有对称或三角形结构,即默认继承自 CsparseMatrix
和 generalMatrix
。
注意
如果您想使用现有稀疏矩阵中基于 0 的 i
(和 j
)槽,则确实需要使用 index1 = FALSE
(或将 + 1
添加到 i
和 j
)。
例子
## simple example
i <- c(1,3:8); j <- c(2,9,6:10); x <- 7 * (1:7)
(A <- sparseMatrix(i, j, x = x)) ## 8 x 10 "dgCMatrix"
summary(A)
str(A) # note that *internally* 0-based row indices are used
(sA <- sparseMatrix(i, j, x = x, symmetric = TRUE)) ## 10 x 10 "dsCMatrix"
(tA <- sparseMatrix(i, j, x = x, triangular= TRUE)) ## 10 x 10 "dtCMatrix"
stopifnot( all(sA == tA + t(tA)) ,
identical(sA, as(tA + t(tA), "symmetricMatrix")))
## dims can be larger than the maximum row or column indices
(AA <- sparseMatrix(c(1,3:8), c(2,9,6:10), x = 7 * (1:7), dims = c(10,20)))
summary(AA)
## i, j and x can be in an arbitrary order, as long as they are consistent
set.seed(1); (perm <- sample(1:7))
(A1 <- sparseMatrix(i[perm], j[perm], x = x[perm]))
stopifnot(identical(A, A1))
## The slots are 0-index based, so
try( sparseMatrix(i=A@i, p=A@p, x= seq_along(A@x)) )
## fails and you should say so: 1-indexing is FALSE:
sparseMatrix(i=A@i, p=A@p, x= seq_along(A@x), index1 = FALSE)
## the (i,j) pairs can be repeated, in which case the x's are summed
(args <- data.frame(i = c(i, 1), j = c(j, 2), x = c(x, 2)))
(Aa <- do.call(sparseMatrix, args))
## explicitly ask for elimination of such duplicates, so
## that the last one is used:
(A. <- do.call(sparseMatrix, c(args, list(use.last.ij = TRUE))))
stopifnot(Aa[1,2] == 9, # 2+7 == 9
A.[1,2] == 2) # 2 was *after* 7
## for a pattern matrix, of course there is no "summing":
(nA <- do.call(sparseMatrix, args[c("i","j")]))
dn <- list(LETTERS[1:3], letters[1:5])
## pointer vectors can be used, and the (i,x) slots are sorted if necessary:
m <- sparseMatrix(i = c(3,1, 3:2, 2:1), p= c(0:2, 4,4,6), x = 1:6, dimnames = dn)
m
str(m)
stopifnot(identical(dimnames(m), dn))
sparseMatrix(x = 2.72, i=1:3, j=2:4) # recycling x
sparseMatrix(x = TRUE, i=1:3, j=2:4) # recycling x, |--> "lgCMatrix"
## no 'x' --> patter*n* matrix:
(n <- sparseMatrix(i=1:6, j=rev(2:7)))# -> ngCMatrix
## an empty sparse matrix:
(e <- sparseMatrix(dims = c(4,6), i={}, j={}))
## a symmetric one:
(sy <- sparseMatrix(i= c(2,4,3:5), j= c(4,7:5,5), x = 1:5,
dims = c(7,7), symmetric=TRUE))
stopifnot(isSymmetric(sy),
identical(sy, ## switch i <-> j {and transpose }
t( sparseMatrix(j= c(2,4,3:5), i= c(4,7:5,5), x = 1:5,
dims = c(7,7), symmetric=TRUE))))
## rsparsematrix() calls sparseMatrix() :
M1 <- rsparsematrix(1000, 20, nnz = 200)
summary(M1)
## pointers example in converting from other sparse matrix representations.
if(requireNamespace("SparseM") &&
packageVersion("SparseM") >= "0.87" &&
nzchar(dfil <- system.file("extdata", "rua_32_ax.rua", package = "SparseM"))) {
X <- SparseM::model.matrix(SparseM::read.matrix.hb(dfil))
XX <- sparseMatrix(j = X@ja, p = X@ia - 1L, x = X@ra, dims = X@dimension)
validObject(XX)
## Alternatively, and even more user friendly :
X. <- as(X, "Matrix") # or also
X2 <- as(X, "sparseMatrix")
stopifnot(identical(XX, X.), identical(X., X2))
}
也可以看看
Matrix(*, sparse=TRUE)
用于从稠密矩阵构造此类矩阵。这在小样本中更容易,但对于需要像 sparseMatrix()
之类的大矩阵来说效率较低(或不可能)。此外,bdiag
和 Diagonal
用于(块)对角线,bandSparse
用于带状稀疏矩阵构造函数。
通过 rsparsematrix()
生成随机稀疏矩阵。
标准R xtabs(*, sparse=TRUE)
,对于稀疏表和sparse.model.matrix()
用于构建稀疏模型矩阵。
考虑CsparseMatrix
和类似的类定义帮助文件。
相关用法
- R sparseMatrix-class 虚拟类“sparseMatrix”——稀疏矩阵之母
- R sparseQR-class 稀疏 QR 分解
- R sparse.model.matrix 构造稀疏设计/模型矩阵
- R sparseVector-class 稀疏向量类
- R sparseLU-class 稀疏 LU 分解
- R sparseVector 从非零条目构造稀疏向量
- R spMatrix 三元组的稀疏矩阵构造函数
- R solve-methods 函数求解矩阵包中的方法
- R symmetricMatrix-class 包矩阵中对称矩阵的虚拟类
- R symmpart-methods 矩阵的对称部分和偏斜(对称)部分
- R dtrMatrix-class 三角形稠密数值矩阵
- R facmul-methods 乘以矩阵因式分解的因数
- R updown-methods 更新和降级稀疏 Cholesky 分解
- R bdiag 构建分块对角矩阵
- R printSpMatrix 灵活格式化和打印稀疏矩阵
- R all.equal-methods 函数 all.equal() 的矩阵封装方法
- R boolmatmult-methods 布尔算术矩阵乘积:%&% 和方法
- R ltrMatrix-class 三角密集逻辑矩阵
- R Hilbert 生成希尔伯特矩阵
- R nearPD 最近正定矩阵
- R lsyMatrix-class 对称密集逻辑矩阵
- R CHMfactor-class 稀疏 Cholesky 分解
- R dgCMatrix-class 压缩、稀疏、面向列的数值矩阵
- R Cholesky-methods Cholesky 分解方法
- R Subassign-methods “[<-”的方法 - 分配给“矩阵”的子集
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 General Sparse Matrix Construction from Nonzero Entries。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。