2014-03-07 2 views
1

I는 다음과 같이 할 수 나는 블록 행렬을 구성하는 데 사용되는 두 개의 행렬을 T. 전화를 몇 가지 변수에 따라 R에서 루프를 사용하여 블록 매트릭스를 만들려고 해요 :만들기 블록 행렬

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를 어떻게 설정 하느냐에 따라 결과가 달라집니다. = 3 T를 들어

C=rbind(cbind(A,B),cbind(B,A)) 

: T = 2의 T를 들어

C=rbind(cbind(A,B,B),cbind(B,A,B),cbind(B,B,A)) 

= 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에 따라 나를위한 블록 행렬을 만들 수 있습니다.

감사합니다.

답변

1

당신이 할 수 있습니다 :

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 
    } 
} 
+0

감사합니다. 의도 한대로 작동합니다. –

+0

당신을 진심으로 환영합니다! – Pop

0

당신의 설명에서 나는 당신이 당신의 최종 매트릭스에 하나의 A와 T-1 조식을한다고 가정.

올바른지 확인하려면 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)) 
+0

답변 해 주셔서 감사합니다. T를 너무 높게 설정하면 컴퓨터가 다운되는 것 같습니다. 나는 순열의 수가 너무 높을 것 같아. 이 문제를 해결할 방법이 있다면 나는 모른다. –

+0

permutation의 수가 꽤 커질 수 있으므로 높은 값의 T를 추천합니다. –

0

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))