打破细胞

时间:2015-10-23 04:44:39

标签: matlab cell

我有一个单元格(47,1),其中每个元素本身就是一个单元格(12,1),这12个单元格中的每一个都包含一个双精度(31,1)。这意味着我有17484个值。如何将所有这些值提取到一个单元格中(17484,1)?

2 个答案:

答案 0 :(得分:0)

如果我正确理解你的问题,你有一个嵌套的单元格数组(47 x 1),其中每个单元格是另一个12 x 1单元格,每个单元格是31 x 1数组....这是存储数据的一种非常糟糕的方式......但让我们顺其自然。

您在MATLAB中输入的命令是,假设您的矩阵存储在A中:

B = reshape(cell2mat(cellfun(@cell2mat, A, 'uni', 0)), 1, []);

让我们一步一步地解决这个问题,然后解释一下:

  1. cellfun(@cell2mat, A, 'uni', 0)

    cellfun是一个迭代单元数组中所有单元格并向其应用函数的函数。 A中的每个单元格将是12 x 1单元阵列,其中每个单元格是31 x 1矩阵。在我们的例子中,我们使用函数cell2mat来获取所有这些31 x 1矩阵的单元格,并将它们连接成一个31 x 12矩阵。 uni=0标志表示cellfun的输出不是统一的数字矩阵。相反,cellfun的输出将是47个单元阵列,其中每个单元元素是31×12矩阵。

  2. cell2mat(...#1...)

    这将所有31 x 12矩阵连接在一起,这样我们得到一个31 x 564矩阵,因为步骤#1的输出是另一个单元阵列。

  3. B = reshape(...#2..., [], 1);

    最后一步是将此矩阵和reshape矩阵放入一个大小为17484 x 1的单个向量中。这将在步骤#2中获取中间矩阵的每一列,并将它们全部放入一个向量中。 B包含此输出向量。

  4. 如果出于某种原因,您希望将每个元素放入单个单元格中,则可以使用未记录的函数sprintfc将每个元素放在输出B中并将它们放入单个单元格中:

    Bcell = sprintfc('%f', B);
    

答案 1 :(得分:0)

首先,如果您可以更改数据结构,请将其更改为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)