Информация о непустом размере для массивов ячеек

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


person hyperknot    schedule 03.11.2011    source источник
comment
Как насчет ячейки массивов? c= {[1], [2 4 5], [3]};. Он не должен быть очень производительным, но его легко использовать. Вам нужно выполнять другие операции, кроме чтения и сохранения новых точек?   -  person Clement J.    schedule 03.11.2011
comment
Вы говорите, что хотите хранить вершины (x,y), но затем помещаете в свой массив ячеек только целые числа. Сохраняются ли эти индексы вершин в другом месте?   -  person arne.b    schedule 03.11.2011


Ответы (2)


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

  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'
    
person John Colby    schedule 03.11.2011
comment
В итоге я использовал структуру для вершин, массив ячеек для одной строки и массив ячеек для всех строк. Я думаю, что таким образом это довольно ясно и эффективно. Как вы думаете? pastebin.com/uKC98Ym7 - person hyperknot; 04.11.2011

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

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

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

person Clement J.    schedule 03.11.2011