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

#arrays #list #matlab #polyline #cell-array

#массивы #Список #matlab #полилиния #ячейка-массив

Вопрос:

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

Комментарии:

1. Как насчет ячейки массивов? c= {[1], [2 4 5], [3]}; . Он не должен быть очень производительным, но простым в использовании. Вам нужно выполнять другие операции, кроме чтения и сохранения новых точек?

2. Вы говорите, что хотите сохранить вершины (x,y) , но затем помещаете в свой массив ячеек только целые числа. Хранятся ли эти индексы для вершин в другом месте?

Ответ №1:

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

  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'
      

Комментарии:

1. В итоге я использовал структуру для вершин, массив ячеек для одной строки и массив ячеек для всех строк. Я думаю, что таким образом это довольно понятно и эффективно. Что вы думаете? pastebin.com/uKC98Ym7

Ответ №2:

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

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

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