Самый обычный метод хранения данных XYZ в MATLAB.

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

ВАРИАНТ 1

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

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

ВАРИАНТ 2

Храните координаты X, Y и Z как один вектор n * 3.

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

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


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

ВАРИАНТ 1

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

ВАРИАНТ 2

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

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

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

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


person Bill Cheatham    schedule 12.09.2010    source источник


Ответы (3)


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

Если вы будете строить много трехмерных графиков и предпочитаете хранить данные в одной комбинированной форме, напишите небольшой инструмент 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, чтобы работать с вами, работать так, как вы работаете, так, как вам нравится думать.

person Community    schedule 12.09.2010
comment
Спасибо, я взял это на вооружение. Я думаю, что структура — это хороший совет, и сейчас я использую их для хранения матрицы XYZ и «битов», связанных с точками данных. - person Bill Cheatham; 12.09.2010

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

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

person Oliver Charlesworth    schedule 12.09.2010
comment
Спасибо, я так и думал. Я попытался прояснить вторую часть вопроса. (Кроме того, какое из n x 3 или 3 x n более традиционно?) - person Bill Cheatham; 12.09.2010

У меня только что была возможная мысль о второй половине моего вопроса. Если бы я сохранил данные в виде матрицы 3 x n x m (вместо n x m x 3), это упростило бы многие операции:

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

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

person Bill Cheatham    schedule 12.09.2010
comment
Stack Overflow — это не классический форум, не размещайте здесь этот материал, а отредактируйте исходный вопрос, пожалуйста! - person Mikhail; 14.09.2010
comment
Да, я понимаю это - я тщательно обдумывал, где опубликовать это, но, поскольку это потенциальный ответ на мой собственный вопрос, я подозревал, что было бы лучше разместить его в разделе ответов. Или я не имею права отвечать на свой вопрос? - person Bill Cheatham; 14.09.2010