【问题标题】:Assign to subset of cell array - MATLAB分配给元胞数组的子集 - MATLAB
【发布时间】:2015-09-24 09:18:02
【问题描述】:

我正在尝试将一个元胞数组分配给另一个元胞数组的子集,例如

data_date1 = '08/15/2003';
data_date2 = '08/16/2003';
data_date3 = '08/17/2003';
num1 = 56;
num2 = 23;
num3 = 2;

cell_1={data_date1, num1; data_date2, num2};

array=cell(3,1)

array{1:2} = cell_1  % problem line
array{3} = {data_date3, num3}

对于上下文,cell_1 数组是另一个函数的输出,我正在尝试将 array 填充到另一个函数的循环中。

什么是正确的方法?

【问题讨论】:

标签: matlab


【解决方案1】:

要将元胞数组元素从一个元胞数组复制到另一个元胞数组,而无需访问元素的内容,您可以使用标准矩阵索引语法,该语法使用方括号 (i,j) 而不是花括号 {i,j}

M 成为一个元胞数组: M(i,j) 返回一个 1x1 cellM(i,j) 元素的副本 M{i,j} 返回M(i,j)th 元素的内容。这可以是任何类型,具体取决于单元格内容。

元胞数组作为标准数组

因此,在您的情况下,您可以将子数组分配给更大的数组,但您只需要注意索引(所有维度的大小都应该正确)。

因此,如果您声明一个 3x2 单元数组

array=cell(3,2)

如果地址正确,您可以将 2x2 子数组分配给它:

>> array(1:2,:) = cell_1

array = 
    '08/15/2003'    [56]
    '08/16/2003'    [23]
              []      []

然后添加你最后的元素:

>> array(3,:) = {data_date3, num3}

array = 
    '08/15/2003'    [56]
    '08/16/2003'    [23]
    '08/17/2003'    [ 2]

这种方式将您的数组视为nxm 标准数组,只需将cell 类型视为特定类型(就像您将拥有doubleuint8 数组一样)而不必知道数据的类型它们包含在里面。

嵌套元胞数组

元胞数组具有这种嵌套能力。所以一个单元格数组的一个单元格可以包含另一个完整的单元格数组(每个单元格可以包含单元格数组等......虽然我不建议嵌套太深)。

在此配置中,您的最终数组可以是您定义的 3x1 元胞数组,其中每个元胞将包含另一个 1x2 元胞数组。您也可以将子数组分配给这种类型,但源和目标的大小必须匹配。因此,如果您更喜欢这种形式,则必须稍微不同地定义您的 cell_1

>> cell_1= { {data_date1, num1} ; { data_date2, num2} }

cell_1 = 
    {1x2 cell}
    {1x2 cell}

注意将元胞数组嵌套到更大的元胞数组中,以便拥有一个 1x2 子数组,您现在可以将其分配给主数组:

>> array=cell(3,1) ;
array(1:2) = cell_1
array = 
    {1x2 cell}
    {1x2 cell}
    []

现在添加最后一个元素有两种不同的方法,但需要小心:

array(3) = { {data_date3, num3} } %// assign a 1x2 sub array to the 3rd element of "array"
array{3} = {data_date3, num3}     %// set the content of the 3rd element of "array" as a 1x2 cell array

这两行是等价的,它们产生相同的结果。您可以根据自己喜欢的样式来选择或执行(或者可能会受到数据进入的形状的影响)。

【讨论】:

    【解决方案2】:

    有错误是因为你不能像这样对单元格数组使用索引。要么你必须这样做:

    array{1} = cell_1;
    array{2} = cell_1;
    array{3} = {data_date3, num3};
    

    或者你可以试试repmat(不需要初始化array = cell(3,1)),虽然不知道你的array有多长:

    array = repmat({cell_1}, 2, 1);    
    % or: array = {cell_1; cell_1}
    array{3} = {data_date3, num3};
    

    如果array 很短,另一种方式:

    array = {cell_1; cell_1; {data_date3, num3}};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      • 2012-03-14
      相关资源
      最近更新 更多