Непустая информация о размере для массивов ячеек - PullRequest
1 голос
/ 03 ноября 2011

В 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?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2011

Это плохой способ хранения ваших данных, для тех самых проблем, с которыми вы сталкиваетесь.Пара замечаний:

  1. Первый столбец используется в качестве индекса (т. Е. 1 для полилинии 1, 2 для полилинии 2 и т. Д.), Что не является необходимым, поскольку эта информация уже неявно хранится в структуреваших данных.
  2. При использовании этого метода точки должны быть сложены рядом друг с другом, что станет кошмаром для индексации.
  3. С каждым x и yв другой ячейке будет ненужная хлопотная задача для построения / хранения даже одной точки.

Есть 2 хороших способа хранения всей этой информации.

  1. Массив ячеек : Как отметил Клемент, это красиво и просто, и позволит вам накладывать разные точки на одной и той же ломаной вдоль второго измерения.

    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'
    
0 голосов
/ 03 ноября 2011

Чтобы ответить на ваш первый вопрос, вы можете использовать это:

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

С [...] вы рассматриваете срез ячейки как массив, а не несколько скалярных значений.

...