#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, 2 для полилинии 2 и т.д.), Что не нужно, поскольку эта информация уже неявно хранится в структуре ваших данных.
- С помощью этого метода точки должны быть уложены рядом друг с другом, что будет кошмаром для индексации.
- С каждым x и y в другой ячейке будет ненужно создавать / сохранять даже одну точку.
Есть 2 хороших способа сохранить всю эту информацию.
-
Массив ячеек: как указал Клемент, это удобно и просто, и позволит вам складывать разные точки в одной и той же полилинии вдоль второго измерения.
celldata = {[] [4 5] []}; celldata{2} = [celldata{2}; 1 1]; celldata{3} = [0.5 0.5]; >> celldata celldata = [] [2x2 double] [1x2 double]
-
Структура массива: это хороший способ, если вы хотите сохранить метаданные на уровне полилинии вместе с вашими точками.
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
При [...]
этом фрагмент ячейки обрабатывается как массив, а не как несколько скалярных значений.