arrays - 추출 - 매트랩 행렬 이어붙이기




행렬을 R에 배열로 결합 (5)

내가 만든 여러 행렬이 있다면 어떻게 하나의 배열로 결합 할 수 있습니까? 각 행에 200 행과 200 열이있는 8 개의 행렬이 있으며 dim = 200,200,8 배열로 결합해야합니다. 그래서 저는 각 행렬을 배열 배열로 원합니다.


관련 항목 : R에 여러 행렬을 스택하는 방법

지금까지 모든 솔루션의 문제점은 행렬 (이 dplyrdata.table 이 아닌)이 행과 열의 순서가 같지 않을 때 bind는 서로 관련이없는 값을 스택에 쌓을 때 .

각 차원의 이름을 확인하고 고려하려면 narray 살펴 narray .

(면책 조항 : 나는 패키지를 썼다)


그것은 당신이 그것들을 column-major 또는 row-major로 결합 할 것인지에 달려 있습니다. 이것은 cbindrbind 를 사용하여 벡터를 행렬로 결합하는 것과 유사합니다. R은 행렬을 열 순서로 저장하기 때문에 다음과 같이 수행하는 것이 가장 쉽습니다.

matrices <- list(
  matrix( 1:9 , 3 , 3 ),
  matrix( 10:18 , 3 , 3 )
);

#it is assumed all matrices in the list have equal dimensions
array1 <- array(
  data = do.call(cbind, matrices), 
  dim = c(dim(matrices[[1]]), length(matrices))
);

새로운 차원 (이 경우 2)은 3 차원이됩니다. print 메서드의 출력 결과를 보면, 마지막 차원으로 인쇄를 분할하기 때문에이 모양이 정확합니다.

> print(array1)
, , 1

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

, , 2

     [,1] [,2] [,3]
[1,]   10   13   16
[2,]   11   14   17
[3,]   12   15   18

그러나 때로는 첫 번째 차원으로 결합해야 할 수도 있습니다 (예 :

array2 <- array (
  data = do.call(rbind, lapply(matrices, as.vector)), 
  dim = c(length(matrices), dim(matrices[[1]]))
);

print(array2[1,,])

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9 

예를 들어,이 행렬을 column이있는 데이터 프레임에 할당하려고한다고 가정합니다. 각 행에 대해 하나의 행렬. 그런 다음 첫 번째 차원 인 일명 nrow 는 배열과 데이터 프레임에서 일치해야합니다.

 mydf <- data.frame(foo = 1:2, row.names=c("first", "second"))
 mydf$bar <- array1
  Error in `$<-.data.frame`(`*tmp*`, "bar", value = 1:18) : 
    replacement has 3 rows, data has 2

 mydf$bar <- array2
 mydf$bar

이건 어때:

combmat <- array(dim=c(200,200,8), data=cbind(matrix1,matrix2,...,matrix8) )

abind 과 비슷한 버전이지만 추가 패키지를 사용하지 않습니다. 모든 것을 list 로 모으고 sapply 옵션을 simplify= 하여리스트의 각 부분에 아무 것도하지 않고 "array"simplify= 하십시오 ( identity 단지 객체를 반환하고 function(x) x 와 같습니다) :

sapply(list(x,y), identity, simplify="array")
# similarly to save a couple of keystrokes, the following is usually identical
sapply(list(x,y), I, simplify="array")

#, , 1
#
#     [,1] [,2] [,3]
#[1,]    1    4    7
#[2,]    2    5    8
#[3,]    3    6    9
#
#, , 2
#
#     [,1] [,2] [,3]
#[1,]   10   13   16
#[2,]   11   14   17
#[3,]   12   15   18

새 배열의 각 원래 매트릭스 이름을 식별자로 유지하려면 다음을 시도하십시오.

sapply(mget(c("x","y")), identity, simplify="array")

미래는 또한 simplify2array 와 동일하다는 점에 주목합니다.

simplify2array(list(x,y))

library('abind')
abind(m1, m2, m3, along = 2.5)
abind(m1, m2, m3, along = 3)

m4 <- list(m1, m2, m3)
abind(m4, along = 3) 

       along        input = matrix + matrix                       output 
----------------------------------------------------------------------------
        0         split columns and row bind them                 array
        0.5       same as 0                                       array
        1         combine matrices into one matrix by rowwise     matrix
        1.5       split columns and column bind them              array
        2         combine matrices into one matrix by columnwise  matrix
        2.5       Form an array with matrices                     array
        3         Same as 2.5                                     array




matrix