【问题标题】:Fill in bigger matrix by smaller submatrices用更小的子矩阵填充更大的矩阵
【发布时间】:2017-03-03 06:13:13
【问题描述】:

我需要通过以下方式使用较小的子矩阵创建一个更大的矩阵。这些较小的子矩阵来自我的模型,它们可以是 1x1、2x2、3x3、4x4 或 5x5。新方阵的维度将由所有子矩阵的列数之和确定。例如下面我们有 1x1,2x2 和 1x1 矩阵,因此较大矩阵的维度将是 4x4 (1+2+1=4)。问题是我需要递归执行 50 次。每次我都会有一堆不同维度的子矩阵,我需要使用这些较小的子矩阵制作一个像上面这样的更大矩阵。我将非常感谢任何帮助。

  A1<-runif(1)

  A <- matrix(runif(4), 2, 2)
  A2<- A %*% t(A)

  A3<-runif(1)
  A4<-matrix(runif(4),2,2)
  new.mat<-matrix(c(A1,0,0,0,0,A2[1],A2[2],0,0,A2[3],A2[4],0,0,0,0,A3),nrow=4,ncol=4)

 A1
[1] 0.8754123
 A2
          [,1]      [,2]
[1,] 0.9307090 0.3919325
[2,] 0.3919325 0.3857751
 A3
[1] 0.323764
     new.mat
          [,1]      [,2]      [,3]     [,4]
  [1,] 0.8754123 0.0000000 0.0000000 0.000000
  [2,] 0.0000000 0.9307090 0.3919325 0.000000
  [3,] 0.0000000 0.3919325 0.3857751 0.000000
  [4,] 0.0000000 0.0000000 0.0000000 0.323764

【问题讨论】:

标签: r matrix


【解决方案1】:

这里有一个以 R 为底的解来构造块对角矩阵:

set.seed(42)
A1<-runif(1)

A <- matrix(runif(4), 2, 2)
A2<- A %*% t(A)

A3<-runif(1)

L <- list(A1, A2, A3)

n <- sum(sapply(L, function(a) nrow(as.matrix(a))))
AAA <- matrix(0, n, n)

start <- 1
for (i in 1:length(L)) {
  ni <- nrow(as.matrix(L[[i]]))
  AAA[start:(start+ni-1), start:(start+ni-1)] <- L[[i]]
  start <- start+ni
}

最好将子矩阵放在 List 中,所以我从 L &lt;- list(A1, A2, A3) 开始。其余的是使用索引范围。结果如下:

> AAA
         [,1]      [,2]      [,3]      [,4]
[1,] 0.914806 0.0000000 0.0000000 0.0000000
[2,] 0.000000 1.5677536 0.8010704 0.0000000
[3,] 0.000000 0.8010704 0.4937131 0.0000000
[4,] 0.000000 0.0000000 0.0000000 0.5190959

包装矩阵:

Matrix有一个函数bdiag()来构造块对角矩阵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    相关资源
    最近更新 更多