R 通过循环创建块矩阵

R 通过循环创建块矩阵,r,matrix,R,Matrix,我试图使用R中的循环创建块矩阵,这取决于我称之为T的变量。用于构造块矩阵的两个矩阵可能如下所示: A=matrix(c(1,0.3,0.3,1.5),nrow=2) B=matrix(c(0.5,0.3,0.3,1.5),nrow=2) 因此,根据我设置的T,我需要不同的结果。对于T=2: C=rbind(cbind(A,B),cbind(B,A)) 对于T=3: C=rbind(cbind(A,B,B),cbind(B,A,B),cbind(B,B,A)) 对于T=5: C=rbind

我试图使用R中的循环创建块矩阵,这取决于我称之为T的变量。用于构造块矩阵的两个矩阵可能如下所示:

A=matrix(c(1,0.3,0.3,1.5),nrow=2)

B=matrix(c(0.5,0.3,0.3,1.5),nrow=2)
因此,根据我设置的T,我需要不同的结果。对于T=2:

C=rbind(cbind(A,B),cbind(B,A))
对于T=3:

C=rbind(cbind(A,B,B),cbind(B,A,B),cbind(B,B,A))
对于T=5:

C=rbind(cbind(A,B,B,B,B),cbind(B,A,B,B,B),cbind(B,B,A,B,B),cbind(B,B,B,A,B),cbind(B,B,B,B,A))
基本上,我只是尝试创建一个循环或类似的东西,在这里我可以指定我的T,它将根据T为我创建块矩阵

谢谢

您可以这样做:

N <- nrow(A)
C <- matrix(NA,N*T,N*T)
for (i in 1:T){
   for (j in 1:T){
     if (i == j)
        C[(i-1)*N+1:N, (j-1)*N+1:N] <- A
     else
        C[(i-1)*N+1:N, (j-1)*N+1:N] <- B
   }
}

N根据您的解释,我想您希望在最终矩阵中使用单个A和T-1 B

如果这是正确的,那么下面是使用combinat库中的permn函数的快速尝试。我所做的就是使用排列生成表达式,然后对其求值

A = matrix(c(1,0.3,0.3,1.5),nrow=2)
B = matrix(c(0.5,0.3,0.3,1.5),nrow=2)
T = 5
x = c("A", rep("B",T-1))
perms = unique(permn(x)) #permn generates non-unique permutations
perms = lapply(perms, function(xx) {xx=paste(xx,collapse=","); xx=paste("cbind(",xx,")")})
perms = paste(perms, collapse=",")
perms = paste("C = rbind(",perms,")",collapse=",")
eval(parse(text=perms))

使用
blockmatrix
包,这非常简单

library(blockmatrix)

# create toy matrices (block matrix elements)
# with values which makes it easier to track them in the block matrix in the example here
A <- matrix("a", nrow = 2, ncol = 2)
B <- matrix("b", nrow = 2, ncol = 2)

# function for creating the block matrix
# n: number of repeating blocks in each dimension
# (I use n instead of T, to avoid confusion with T as in TRUE)
# m_list: the two matrices in a list

block <- function(n, m_list){      
  # create a 'layout matrix' of the block matrix elements
  m <- matrix("B", nrow = n, ncol = n)
  diag(m) <- "A"

  # build block matrix
  as.matrix(blockmatrix(dim = dim(m_list[[1]]), value = m, list = m_list))
}

# try with different n
block(n = 2, m_list = list(A = A, B = B))
block(n = 3, m_list = list(A = A, B = B))
block(n = 5, m_list = list(A = A, B = B))
库(块矩阵)
#创建玩具矩阵(块矩阵元素)
#使用这些值可以更容易地在本例中的块矩阵中跟踪它们

A谢谢你的回答。如果我把T设置得太高,我的电脑好像要崩溃了。我猜排列的数量太多了。我不知道,是否有办法解决这个问题?我不建议对t的高值使用这个方法,正如你所说,排列的数量可能会变得相当大。