将matlab中的单元格数组转换为R中的列表

时间:2014-07-10 01:53:14

标签: r matlab

我正在将Cell数组转换为R. 在MATLAB中我使用x = cell(10,n)。我希望并为循环中的每个单元分配一个矩阵,如:

for i in 1:10
for j in 1:n
x(i,j) = [i*ones(len,1), ones(len,j)]   

这里就像列数一样。 我如何在R中执行此操作? 我在R中尝试了List,我猜这个x看起来像包含10个列表,每个列表有n个子列表,每个子列表都有一个矩阵。这是对的吗?

图中显示了在Matlab中生成的第一个循环.n = 7。第一行在每个单元格中包含一个数字矩阵。 我想得到的是能够通过使用

获得第一个矩阵“3x10 double”
x[1][1] in R

Refence how to calculate the mean of list of list of matrices in r

This is from Matlab

答案:根据上面的链接代码是这样的:

x<-NULL
for (i in 1:10){
   test<-NULL
for (j in 1:n){
      test[[j]]<-matrix
    }
x[[i]]<-test
}

2 个答案:

答案 0 :(得分:0)

x<-NULL
for (i in 1:10){
   test<-NULL
for (j in 1:n){
      test[[j]]<-matrix
    }
x[[i]]<-test
}

答案 1 :(得分:0)

首先,指定输出中的行数和列数,并定义一个函数,该函数返回输出矩阵中每个元素的内容。

n_rows <- 5
n_cols <- 7
get_element <- function(i, j)
{
  len <- 10
  cbind(rep.int(i, len), matrix(1, len, j))
}

我们需要将所有行和列值的所有组合传递给函数。

index <- arrayInd(seq_len(n_rows * n_cols), c(n_rows, n_cols))   

现在我们用每个行/列对调用get_element。

result <- mapply(get_element, index[, 1], index[, 2])

result是一个列表。这意味着它是一个向量,其中每个元素可以包含不同的值。要获得所需内容,您可以设置此列表的尺寸。

dim(result) <- c(n_rows, n_cols)

result
##      [,1]       [,2]       [,3]       [,4]       [,5]       [,6]       [,7]      
## [1,] Numeric,20 Numeric,30 Numeric,40 Numeric,50 Numeric,60 Numeric,70 Numeric,80
## [2,] Numeric,20 Numeric,30 Numeric,40 Numeric,50 Numeric,60 Numeric,70 Numeric,80
## [3,] Numeric,20 Numeric,30 Numeric,40 Numeric,50 Numeric,60 Numeric,70 Numeric,80
## [4,] Numeric,20 Numeric,30 Numeric,40 Numeric,50 Numeric,60 Numeric,70 Numeric,80
## [5,] Numeric,20 Numeric,30 Numeric,40 Numeric,50 Numeric,60 Numeric,70 Numeric,80

可以使用result[[3, 5]]访问单个矩阵。

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

请注意,虽然具有维度的列表与MATLAB单元阵列最接近,但它是一种很少使用的数据结构。这意味着你不会用这样的结构编写惯用的R代码。 (从MATLAB编码到R编码,你必须做的最大的心理转变之一是从矩阵的思考到向量的思考。)

在这种情况下,显而易见的问题是&#34;为什么需要存储所有这些矩阵?&#34;。可以更轻松地调用get_element并根据需要检索值。