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


R bdiag 構建分塊對角矩陣


R語言 bdiag 位於 Matrix 包(package)。

說明

給定幾個構建塊矩陣,構建一個塊對角矩陣。

用法

bdiag(...)
.bdiag(lst)

參數

...

單個矩陣或矩陣的list

lst

非空矩陣list

細節

對於重要的參數列表, bdiag() 調用 .bdiag() 。後者可能對程序員有用。

通過將參數組合成塊對角矩陣而獲得的稀疏矩陣。

bdiag() 的值繼承自類 CsparseMatrix ,而 .bdiag() 返回 TsparseMatrix

注意

該函數已被編寫並且對於相對較少的塊矩陣(通常本身是稀疏的)的情況是有效的。

目前對於許多小型密集分塊矩陣的情況效率較低。對於許多密集 矩陣的情況,“示例”中的 bdiag_m() 函數速度快一個數量級。

例子


bdiag(matrix(1:4, 2), diag(3))
## combine "Matrix" class and traditional matrices:
bdiag(Diagonal(2), matrix(1:3, 3,4), diag(3:2))

mlist <- list(1, 2:3, diag(x=5:3), 27, cbind(1,3:6), 100:101)
bdiag(mlist)
stopifnot(identical(bdiag(mlist), 
                    bdiag(lapply(mlist, as.matrix))))

ml <- c(as(matrix((1:24)%% 11 == 0, 6,4),"nMatrix"),
        rep(list(Diagonal(2, x=TRUE)), 3))
mln <- c(ml, Diagonal(x = 1:3))
stopifnot(is(bdiag(ml), "lsparseMatrix"),
          is(bdiag(mln),"dsparseMatrix") )

## random (diagonal-)block-triangular matrices:
rblockTri <- function(nb, max.ni, lambda = 3) {
   .bdiag(replicate(nb, {
         n <- sample.int(max.ni, 1)
         tril(Matrix(rpois(n * n, lambda = lambda), n, n)) }))
}

(T4 <- rblockTri(4, 10, lambda = 1))
image(T1 <- rblockTri(12, 20))


##' Fast version of Matrix :: .bdiag() -- for the case of *many*  (k x k) matrices:
##' @param lmat list(<mat1>, <mat2>, ....., <mat_N>)  where each mat_j is a  k x k 'matrix'
##' @return a sparse (N*k x N*k) matrix of class  \code{"\linkS4class{dgCMatrix}"}.
bdiag_m <- function(lmat) {
    ## Copyright (C) 2016 Martin Maechler, ETH Zurich
    if(!length(lmat)) return(new("dgCMatrix"))
    stopifnot(is.list(lmat), is.matrix(lmat[[1]]),
              (k <- (d <- dim(lmat[[1]]))[1]) == d[2], # k x k
              all(vapply(lmat, dim, integer(2)) == k)) # all of them
    N <- length(lmat)
    if(N * k > .Machine$integer.max)
        stop("resulting matrix too large; would be  M x M, with M=", N*k)
    M <- as.integer(N * k)
    ## result: an   M x M  matrix
    new("dgCMatrix", Dim = c(M,M),
        ## 'i :' maybe there's a faster way (w/o matrix indexing), but elegant?
        i = as.vector(matrix(0L:(M-1L), nrow=k)[, rep(seq_len(N), each=k)]),
        p = k * 0L:M,
        x = as.double(unlist(lmat, recursive=FALSE, use.names=FALSE)))
}

l12 <- replicate(12, matrix(rpois(16, lambda = 6.4), 4, 4),
                 simplify=FALSE)
dim(T12 <- bdiag_m(l12))# 48 x 48
T12[1:20, 1:20]

作者

Martin Maechler, built on a version posted by Berton Gunter to R-help; earlier versions have been posted by other authors, notably Scott Chasalow to S-news. Doug Bates's faster implementation builds on TsparseMatrix objects.

也可以看看

Diagonal 用於構造 diagonalMatrix 類的矩陣,或 kronecker 也適用於 "Matrix" 繼承矩陣。

bandSparse 從其非零子/超對角線構造帶狀稀疏矩陣。

請注意,其他 CRANR軟件包有自己的版本bdiag()返回傳統矩陣。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Construct a Block Diagonal Matrix。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。