【问题标题】:Non-empty size information for cell arrays元胞数组的非空大小信息
【发布时间】:2011-12-20 21:26:11
【问题描述】:

在 MATLAB 中,我想在容器中保留一个 折线 列表 - 包含顶点 (x,y) - 我认为最好的办法是使用 单元格数组 这个任务。每条线将在单元格数组中以一行表示,顶点 (x,y) 是单元格的元素。不同的行会有不同的长度,这就是为什么我认为使用元胞数组是个好主意。

但我的问题是我不知道如何附加到单元格数组中每一行的第一个非空元素?

这是一个例子:

cell{1,1} = 1
cell{2,1} = 2
cell{3,1} = 3
cell{2,2} = 4
cell{2,3} = 5

cell =

    [1]     []     []
    [2]    [4]    [5]
    [3]     []     []

例如,现在我想在第 1 行的末尾追加一个新元素,在第 2 行追加一个。我如何知道我可以追加新元素的第一个位置是什么?

或者我使用 元胞数组中的元胞数组来完成这项任务?

您将如何在 MATLAB 中为折线列表实现容器?

【问题讨论】:

  • 一个数组单元呢? c= {[1], [2 4 5], [3]};。它的性能应该不是很高,但很容易使用。是否需要执行读取和存储新点以外的操作?
  • 您说您想存储顶点(x,y),但随后只将整数放入您的元胞数组中。这些顶点索引是否存储在其他地方?

标签: arrays list matlab polyline cell-array


【解决方案1】:

对于您遇到的问题,这是一种存储数据的糟糕方式。几个注意事项:

  1. 第一列用作索引(即,1 表示折线 1,2 表示折线 2,等等),这是不必要的,因为该信息已隐式存储在数据结构中。
  2. 使用此方法,点必须相邻彼此堆叠,这将是索引的噩梦。
  3. 由于每个 x 和 y 都位于不同的单元格中,因此绘制/存储单个点将是一件不必要的麻烦。

有两种存储所有这些信息的好方法。

  1. 元胞数组:就像 Clement 指出的那样,这很好而且简单,并且可以让您在同一条折线上沿第二维堆叠不同的点。

    celldata = {[] [4 5] []};
    celldata{2} = [celldata{2}; 1 1];
    celldata{3} = [0.5 0.5];
    
    >> celldata
    
    celldata = 
    
         []    [2x2 double]    [1x2 double]
    
  2. 结构数组:如果您想将折线级元数据与您的点一起存储,这是一个不错的方法。

    strucdata = struct('points', {[] [4 5] []}, 'info', {'blah', 'blah', 'blah'});
    strucdata(2).points = [strucdata(2).points; 1 1];
    strucdata(3).points = [0.5 0.5];
    
    >> strucdata
    
    strucdata = 
    
    1x3 struct array with fields:
        points
        info
    
    >> strucdata(2)
    
    ans = 
    
        points: [2x2 double]
          info: 'blah'
    

【讨论】:

  • 我最终为顶点使用了一个结构体,为单行使用了一个元胞数组,为所有行使用了一个元胞数组。我认为这种方式非常清晰和有效。你怎么看? pastebin.com/uKC98Ym7
【解决方案2】:

要回答您的第一个问题,您可以使用:

n=1;
length([cell{n,:}])+1
n=2;
length([cell{n,:}])+1

使用[...],您可以将单元格切片视为一个数组,而不是多个标量值。

【讨论】:

    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 2015-10-27
    • 2016-04-13
    相关资源
    最近更新 更多