當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。