rankMatrix
位於 Matrix
包(package)。 說明
計算‘the’矩陣秩,理論上是一個定義明確的函數(*),但在實踐中有些模糊。我們提供了幾種方法,默認對應Matlab的定義。
(*) 矩陣 、 的秩是線性獨立列(或行)的最大數量;因此 。
用法
rankMatrix(x, tol = NULL,
method = c("tolNorm2", "qr.R", "qrLINPACK", "qr",
"useGrad", "maybeGrad"),
sval = svd(x, 0, 0)$d, warn.t = TRUE, warn.qr = TRUE)
qr2rankMatrix(qr, tol = NULL, isBqr = is.qr(qr), do.warn = TRUE)
參數
x |
比如說,維度為 的數字矩陣。 |
tol |
非負數,指定用於測試 “practically zero” 的(相對,“scalefree”)容差,具體含義取決於 |
method |
指定排名計算方法的字符串,可以縮寫為:
|
sval |
|
warn.t |
邏輯指示 |
warn.qr |
在 |
qr |
|
isBqr |
|
do.warn |
邏輯性;如果為 true,則警告 |
細節
qr2rankMatrix()
通常從 rankMatrix()
調用 "qr"
* method
,但可以直接使用 - 如果 qr
分解可用,則效率更高。
值
如果x
是所有0
(或零維度)的矩陣,則秩為零;否則,通常是 1:min(dim(x))
中的正整數,其屬性詳細說明所使用的方法。
在極少數情況下,稀疏NaN
條目)結束。然後,發出警告信號(除非 warn.qr
/do.warn
不為 true)並返回 NA
(具體來說, NA_integer_
)。 分解“fails”在 、 (見上文)的對角線條目中以非有限(通常是
注意
對於大型稀疏矩陣 x
,除非您可以自己指定 sval
,否則當前 method = "qr"
可能是唯一可行的矩陣,因為其他矩陣需要 sval
並調用 svd()
,當前將 x
強製為 denseMatrix
這可能非常慢或不可能,具體取決於矩陣維度。
請注意,在稀疏 x
、 method = "qr"
的情況下,計算所有非嚴格零對角線條目 ,直至包括 Matrix
版本 1.1-0,即該方法隱式使用 tol = 0
,請參閱還有下麵的set.seed(42)
示例。
例子
rankMatrix(cbind(1, 0, 1:3)) # 2
(meths <- eval(formals(rankMatrix)$method))
## a "border" case:
H12 <- Hilbert(12)
rankMatrix(H12, tol = 1e-20) # 12; but 11 with default method & tol.
sapply(meths, function(.m.) rankMatrix(H12, method = .m.))
## tolNorm2 qr.R qrLINPACK qr useGrad maybeGrad
## 11 11 12 12 11 11
## The meaning of 'tol' for method="qrLINPACK" and *dense* x is not entirely "scale free"
rMQL <- function(ex, M) rankMatrix(M, method="qrLINPACK",tol = 10^-ex)
rMQR <- function(ex, M) rankMatrix(M, method="qr.R", tol = 10^-ex)
sapply(5:15, rMQL, M = H12) # result is platform dependent
## 7 7 8 10 10 11 11 11 12 12 12 {x86_64}
sapply(5:15, rMQL, M = 1000 * H12) # not identical unfortunately
## 7 7 8 10 11 11 12 12 12 12 12
sapply(5:15, rMQR, M = H12)
## 5 6 7 8 8 9 9 10 10 11 11
sapply(5:15, rMQR, M = 1000 * H12) # the *same*
## "sparse" case:
M15 <- kronecker(diag(x=c(100,1,10)), Hilbert(5))
sapply(meths, function(.m.) rankMatrix(M15, method = .m.))
#--> all 15, but 'useGrad' has 14.
sapply(meths, function(.m.) rankMatrix(M15, method = .m., tol = 1e-7)) # all 14
## "large" sparse
n <- 250000; p <- 33; nnz <- 10000
L <- sparseMatrix(i = sample.int(n, nnz, replace=TRUE),
j = sample.int(p, nnz, replace=TRUE),
x = rnorm(nnz))
(st1 <- system.time(r1 <- rankMatrix(L))) # warning+ ~1.5 sec (2013)
(st2 <- system.time(r2 <- rankMatrix(L, method = "qr"))) # considerably faster!
r1[[1]] == print(r2[[1]]) ## --> ( 33 TRUE )
## another sparse-"qr" one, which ``failed'' till 2013-11-23:
set.seed(42)
f1 <- factor(sample(50, 1000, replace=TRUE))
f2 <- factor(sample(50, 1000, replace=TRUE))
f3 <- factor(sample(50, 1000, replace=TRUE))
D <- t(do.call(rbind, lapply(list(f1,f2,f3), as, 'sparseMatrix')))
dim(D); nnzero(D) ## 1000 x 150 // 3000 non-zeros (= 2%)
stopifnot(rankMatrix(D, method='qr') == 148,
rankMatrix(crossprod(D),method='qr') == 148)
## zero matrix has rank 0 :
stopifnot(sapply(meths, function(.m.)
rankMatrix(matrix(0, 2, 2), method = .m.)) == 0)
作者
Martin Maechler; for the "*Grad" methods building on suggestions by Ravi Varadhan.
也可以看看
相關用法
- R replValue-class 虛擬類“replValue” - 子分配值的簡單類
- R rep2abI 將向量複製到“abIndex”結果中
- R rleDiff-class rle(diff(.)) 存儲向量的“rleDiff”類
- R rcond-methods 估計條件數的倒數
- R rsparsematrix 隨機稀疏矩陣
- R dtrMatrix-class 三角形稠密數值矩陣
- R facmul-methods 乘以矩陣因式分解的因數
- R solve-methods 函數求解矩陣包中的方法
- R updown-methods 更新和降級稀疏 Cholesky 分解
- R bdiag 構建分塊對角矩陣
- R printSpMatrix 靈活格式化和打印稀疏矩陣
- R symmetricMatrix-class 包矩陣中對稱矩陣的虛擬類
- R all.equal-methods 函數 all.equal() 的矩陣封裝方法
- R boolmatmult-methods 布爾算術矩陣乘積:%&% 和方法
- R ltrMatrix-class 三角密集邏輯矩陣
- R Hilbert 生成希爾伯特矩陣
- R nearPD 最近正定矩陣
- R lsyMatrix-class 對稱密集邏輯矩陣
- R CHMfactor-class 稀疏 Cholesky 分解
- R symmpart-methods 矩陣的對稱部分和偏斜(對稱)部分
- R sparseMatrix 從非零項構建一般稀疏矩陣
- R dgCMatrix-class 壓縮、稀疏、麵向列的數值矩陣
- R Cholesky-methods Cholesky 分解方法
- R Subassign-methods “[<-”的方法 - 分配給“矩陣”的子集
- R ldenseMatrix-class 密集邏輯矩陣的虛擬類“ldenseMatrix”
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Rank of a Matrix。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。