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


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。