35

如果我创建了多个矩阵,如何将它们组合成一个数组?我有 8 个矩阵,每个矩阵有 200 行和 200 列,我需要将它们组合成一个 dim = 200,200,8 的数组。所以我希望我的每个矩阵都是我数组的一部分。

4

7 回答 7

37

您可以使用包中的abind功能abind

library(abind)
newarray <- abind( mat1, mat2, mat3, mat4, along=3 )

## or if mats are in a list (a good idea)

newarray <- abind( matlist, along=3 )
于 2013-03-05T00:17:53.100 回答
25

这是两个的例子。您可以轻松地将其扩展到八个

# create two matricies with however many rows and columns
x <- matrix( 1:9 , 3 , 3 )
y <- matrix( 10:18 , 3 , 3 )
# look at your starting data
x
y

# store both inside an array, with the same first two dimensions,
# but now with a third dimension equal to the number of matricies
# that you are combining
z <- array( c( x , y ) , dim = c( 3 , 3 , 2 ) )

# result
z
于 2013-03-05T00:03:24.737 回答
12

简短的版本是您可以使用以下函数将一组矩阵简化为数组simplify2array

simplify2array(list(x,y))

下面是我之前的回答,展示了如何使用sapply'simplify=参数执行此操作,因为'simplify2array()' 是当 'simplify' 不为假时从 'sapply()' 调用的实用程序- 请参阅?sapply帮助文件。

这是一个类似于abind-ing 的版本,但没有使用任何额外的包。将所有内容收集到 a 中list,然后使用sapply' 选项到simplify=a 中"array",对列表的每个部分都没有执行任何操作(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")
于 2016-04-06T02:14:02.373 回答
3

这取决于您是否要将它们组合为列优先或行优先。这类似于使用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:

> 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 

例如,假设您要将这些矩阵分配给具有列的数据框;每行一个矩阵。然后第一个维度,也就是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
于 2013-12-23T04:15:02.503 回答
1
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
于 2017-02-06T12:05:27.017 回答
0

这个怎么样:

combmat <- array(dim=c(200,200,8), data=cbind(matrix1,matrix2,...,matrix8) )
于 2013-03-05T00:08:40.220 回答
0

相关:如何在 R 中堆叠多个矩阵

到目前为止,所有解决方案的问题在于,当矩阵(不是data.frames - 为此dplyr并且data.table工作正常)没有相同的行和列顺序时,bind 会将不相关的值相互堆叠。

如果您想检查并考虑每个维度中的名称,请查看narray

在此处输入图像描述

(免责声明:我写了这个包)

于 2017-01-08T22:47:52.183 回答