Matlab 分解细胞
我有一个单元格(47,1),其中每个元素本身就是一个单元格(12,1),这12个单元格中的每一个都包含一个双(31,1)。这意味着我有17484个值。如何将所有这些值提取到一个单元格(17484,1)中 如果我正确理解您的问题,您有一个嵌套的单元格数组(Matlab 分解细胞,matlab,cell,Matlab,Cell,我有一个单元格(47,1),其中每个元素本身就是一个单元格(12,1),这12个单元格中的每一个都包含一个双(31,1)。这意味着我有17484个值。如何将所有这些值提取到一个单元格(17484,1)中 如果我正确理解您的问题,您有一个嵌套的单元格数组(47 x 1),其中每个单元格是另一个12 x 1单元格,每个单元格是31 x 1数组。。。。这是一种非常糟糕的数据存储方式。。。但让我们顺其自然 在MATLAB中输入的命令是,假设矩阵存储在A: B = reshape(cell2mat(cel
47 x 1
),其中每个单元格是另一个12 x 1
单元格,每个单元格是31 x 1
数组。。。。这是一种非常糟糕的数据存储方式。。。但让我们顺其自然
在MATLAB中输入的命令是,假设矩阵存储在A
:
B = reshape(cell2mat(cellfun(@cell2mat, A, 'uni', 0)), 1, []);
让我们一步一步地将其分解,并一边进行解释:
cellfun(@cell2mat,A'uni',0)
是一个函数,它迭代单元数组中的所有单元并对其应用函数。A
中的每个单元格都是一个12 x 1的单元格数组,其中每个单元格都是一个31 x 1的矩阵。在我们的例子中,我们使用函数获取所有这些31 x 1矩阵的单元,并将它们连接成31 x 12矩阵。uni=0
标志表示cellfun
的输出不是统一的数值矩阵。相反,cellfun
的输出将是一个47单元数组,其中每个单元元素是一个31 x 12矩阵cell2mat(…#1…)
这将所有31 x 12矩阵连接在一起,因此我们得到一个31 x 564矩阵,因为步骤1的输出是另一个单元数组B=重塑(…#2…,[],1)代码>
最后一步是将该矩阵和该矩阵合并为一个大小为17484 x 1的向量。这将在步骤#2中获取中间矩阵的每一列,并将它们全部放入一个向量中<代码>B
包含此输出向量如果出于某种原因希望将每个元素放入单个单元格,可以使用undocumented函数获取输出
B
中的每个元素并将其放入单个单元格:
Bcell = sprintfc('%f', B);
首先,如果可以更改数据结构,请将其更改为47 x 12 x 31的双精度。这样做的许多优点之一是,您可能根本不需要进行这种转换,而是使用线性索引
%some example data
X=rand(4,5,6)
%3d indexing
X(1,2,3)
%linear indexing
X(3)
%Converting to 1-d:
X=X(:)
如果您想继续使用数据结构,可以使用X=[X{:}]
。此代码的每次调用都将数据结构的两个外部级别合并到一个单元格中,因此必须调用它两次
X=[X{:}]
X=[X{:}]
%There are only very few cases, where numeric data should be stored in a cell. Conciser removing the last line to get a vector.
X=num2cell(X)