当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R sparseMatrix 从非零项构建一般稀疏矩阵


R语言 sparseMatrix 位于 Matrix 包(package)。

说明

根据非零条目的位置和值,以用户友好方式构造稀疏矩阵(继承自虚拟 class CsparseMatrixRsparseMatrixTsparseMatrix )。

建议使用此接口,而不是通过 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

长度相等的整数向量,指定矩阵的非零(或非 TRUE )条目的位置(行索引和列索引)。请注意,当 x 不缺失时,会添加重复对 对应的 ,以与类 TsparseMatrix 的定义保持一致,除非 use.last.ijTRUE ,在这种情况下仅最后使用

p

指针的整数向量,每一列(或行)一个,指向列(或行)中元素的初始(从零开始)索引。必须恰好缺少 ijp 之一。

x

可选,通常为矩阵条目的非零值。如果指定,则长度必须等于 i (或 j )的长度或等于 1,在这种情况下,x 将根据需要进行回收。如果丢失,则结果是非零模式矩阵,即从类 nsparseMatrix 继承。

dims

可选的长度为 2 的矩阵维度整数向量。如果丢失,则使用!index1+c(max(i),max(j))

dimnames

dimnames 的可选列表;如果缺少,则使用NULL

symmetric

逻辑指示结果矩阵是否应该是对称的。在这种情况下, 应仅指定一个三角形(上三角形或下三角形)。

triangular

逻辑指示结果矩阵是否应该是三角形的。在这种情况下, 应仅指定一个三角形(上三角形或下三角形)。

index1

合乎逻辑的。如果TRUE(默认),那么ij被解释为基于 1 的索引,如下R习俗。也就是说,行和列的计数从 1 开始。如果FALSE,那么它们被解释为从 0 开始的索引。

repr

character 字符串, "C""R""T" 之一,指定稀疏矩阵结果的表示形式,即指定虚拟类 CsparseMatrixRsparseMatrixTsparseMatrix 之一。

giveCsparse

(已弃用,已替换为 repr )逻辑指示结果是否应继承自 CsparseMatrixTsparseMatrix 。请注意,涉及 CsparseMatrix 的操作通常(但并非总是)更高效。

check

逻辑指示是否在返回之前检查结果是否正式有效。除非您知道自己在做什么,否则请勿设置为FALSE

use.last.ij

逻辑指示,在重复(重复)对 的情况下,是否仅应使用最后一对。 FALSE (默认)与类 TsparseMatrix 的定义一致。

细节

必须恰好缺少参数 ijp 之一。

在典型用法中,p 缺失,ij 是正整数向量,x 是数值向量。这三个向量必须具有相同的长度,形成稀疏矩阵的三元组表示。

如果ij 丢失,则p 必须是第一个元素为零的非递减整数向量。它提供行或列索引的压缩或 “pointer” 表示(以缺失者为准)。 prep(seq_along(dp),dp) 的扩展形式,其中 dp <- diff(p) 用作(从 1 开始的)行或列索引。

您不能将 singulartriangular 同时设置为 true;而是使用Diagonal()(或其替代方案,请参阅此处)。

ijpindex1 的值用于创建基于 1 的索引向量 ij,从中使用 x 给出的数值构造 TsparseMatrix ,如果不缺失的话。请注意,在这种情况下,当重复某些对 (又名“duplicated”)时,将添加相应的 ,与TsparseMatrix类的定义保持一致,除非use.last.ij设置为true。

默认情况下,当 repr = "C" 时,返回从此三元组形式派生的 CsparseMatrix,其中 repr = "R" 现在允许直接获取 RsparseMatrix ,而 repr = "T" 将结果保留为 TsparseMatrix

默认返回 CsparseMatrix 对象而不是三元组格式的原因是,在执行矩阵运算时,压缩列形式更容易使用。特别是,如果 x 中没有零,则 CsparseMatrix 是稀疏矩阵的唯一表示。

稀疏矩阵,默认采用压缩稀疏列格式,并且(正式)没有对称或三角形结构,即默认继承自 CsparseMatrixgeneralMatrix

注意

如果您想使用现有稀疏矩阵中基于 0 的 i (和 j )槽,则确实需要使用 index1 = FALSE (或将 + 1 添加到 ij )。

例子


## 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() 之类的大矩阵来说效率较低(或不可能)。此外,bdiagDiagonal 用于(块)对角线,bandSparse 用于带状稀疏矩阵构造函数。

通过 rsparsematrix() 生成随机稀疏矩阵。

标准R xtabs(*, sparse=TRUE),对于稀疏表和sparse.model.matrix()用于构建稀疏模型矩阵。

考虑CsparseMatrix 和类似的类定义帮助文件。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 General Sparse Matrix Construction from Nonzero Entries。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。