Самый обычный метод хранения данных XYZ в MATLAB - PullRequest
3 голосов
/ 12 сентября 2010

У меня есть большой объем данных для импорта в MATLAB, представляющий расположение точек в декартовом пространстве.Что из нижеперечисленного является наиболее обычным для хранения и обработки стандартных данных XYZ?:

ОПЦИЯ # 1

Сохранять координаты X, Y и Z как отдельные n * 1векторы (возможно, внутри структуры?).Это делает:

  • Простое построение графиков: plot3(X, Y, Z)
  • Извлечение отдельных точек немного более запутанным N = [X(i), Y(i), Z(i)]
  • Передача всего набора точек в функцию расширяетчисло различных передаваемых аргументов.

OPTION # 2

Сохранять координаты X, Y и Z как один вектор n * 3.

  • Построить график немного сложнее: plot3(XYZ(:, 1), XYZ(:, 2), XYZ(:, 3))
  • Извлечь отдельные точки проще: N = XYZ(i, :)
  • Проходить весь набор точек легко - всего одна переменная

Исходя из этого, я подозреваю, что второй является более обычным.


Однако некоторые данные, которые я буду обрабатывать, сложнее, поскольку они считываются в виде сетки, где важен формат сетки.Под этим я подразумеваю, что необработанная форма данных представляет собой матрицу * m * 3 вместо матрицы (n * m) * 3.Тот факт, что точка X (i, j) находится рядом с точкой X (i, j + 1), важна.Опять же, представлены два варианта:

ОПЦИЯ # 1

Сохранение каждой координаты X, Y и Z в виде матрицы n * m.

OPTION # 2

Сохранить все точки в виде матрицы n * m * 3.

Я бы предпочел сделать второе здесь, но некоторые параметры, такие как построение графиков, становятся довольно глупыми:

X = XYZ(:, :, 1);
Y = XYZ(:, :, 2);
Z = XYZ(:, :, 3);
plot3(X(:), Y(:), Z(:));

У меня такое чувство, что для этого должно быть соглашение, особенно в сообществе видения и графики.

Ответы [ 3 ]

3 голосов
/ 12 сентября 2010

Я не думаю, что есть какой-то действительно лучший способ сделать это.Лучший способ для вас - это то, что делает вашу жизнь максимально удобной.

Если вы будете делать много трехмерных графиков и предпочитаете переносить данные в одной комбинированной форме, то напишите небольшой инструмент plot3d.Установите его так, чтобы он брал массив nx3 (или структуру по вашему выбору), а затем вызывает plot3, разделяя три столбца.

% =============================
function h = plot3d(data,varargin)
% plots 3-d data (more help is good here)
h = plot3(data(:,1),data(:,2),data(:,3),varargin{:});
if nargout == 0
  clear h
end
% =============================

Я бы добавил несколько дополнительных проверок ошибок в форме данных игораздо лучше помочь, но вы должны получить общее представление.

Лично мне нравится переносить трехмерные данные в один массив nx3.Для других типов вещей, ИМХО, структура лучше.Например, для меня имеет смысл объединить вершины и информацию о тесселяции из триангуляции Делоне в одну структуру.

Разверните matlab, чтобы работать с вами, работать так, как вы работаете, так, как вам нравится.думать.

0 голосов
/ 12 сентября 2010

Я только что подумал о второй половине моего вопроса.Если я сохраню данные в виде матрицы 3 xnxm (вместо nxmx 3), это упростит множество операций:

  • Отдельные координаты можно извлечь с помощью N(:, i, j)
  • ВсеКоординаты X, Y или Z могут быть извлечены как вектор с помощью N(1, :), N(2, :) или N(3, :)
  • Все данные могут быть переданы в функцию одновременно
  • Сохраняетисходный формат данных.
  • Я легко могу быть преобразован в матрицу 3 x (n * m) с помощью N(:, :)

Похоже ли это на подходящее решение?

0 голосов
/ 12 сентября 2010

В ответ на первую половину вашего вопроса поддержание матрицы n x 3 (или 3 x n) намного проще, поскольку делает синтаксис математической математики тривиальным и более эффективным. В общем, вы, вероятно, будете выполнять много математических операций, а затем немного логики отображения в конце, так что я не буду беспокоиться об одноразовом преобразовании, которое вам нужно сделать, например, для вызова. plot3.

Что касается второй половины вашего вопроса, я не уверен, что вы подразумеваете под "сеткой", поэтому я не могу на это ответить!

...