2009-11-11 2 views
1

У меня есть три массива одинаковой длины в Matlab, X, Y и Z. X(i), Y(i) и Z(i) образуют пару трехмерных координат.Сгенерируйте квадратную сетку, учитывая неупорядоченные векторы X, Y и Z

Вопрос теперь в том, как использовать эти три массива для создания квадратных сеток, как показано ниже: alt text http://www.mathworks.com/access/helpdesk/help/techdoc/ref/graphics_m3.gif

Я получил изображение с mesh plot в Matlab документации. Таким образом, очевидно, что команда mesh - это не то, что я хочу, потому что она отображает саму себя в программе Matlab, тогда как мне нужны элементы сетки (вместе с координатами), чтобы я мог строить их сам в другой программе, такой как C#.

Другими словами, я ищу математический алгоритм , чтобы сгенерировать сетки, что позволяет команде mesh построить график ниже.

Редактировать: Я понял, что мой вопрос не был ясен после хорошего ночного сна. Итак, более подробно. Я генерирую x и y вектор с помощью этой команды [x,y]=meshgrid[rangex, rangy], а затем определяю вектор z с помощью функции z(x,y). Я должен был бы вернуть список квадратных элементов (как показано на рисунке ниже) вместе с их соответствующими координатами x, y. Поэтому в основном я просто хочу перечислить следующий график этими данными.

Любые идеи?

+1

Просьба уточнить вопрос. Глядя на расходящиеся ответы, я не думаю, что кто-то из нас понимает, чего вы хотите. – MatlabDoug

+0

Вот некоторые дополнительные сведения, которые вы должны добавить к вопросу, чтобы помочь нам помочь: размер массивов 'X, Y, Z', некоторые примеры значений того, что может быть в них, и разъяснение того, что вы подразумеваете под «элемент» и «точка» (я думаю, по элементу вы ссылаетесь на каждый квадрат в ячейке, и по сути вы ссылаетесь на набор индексов в массив точек, который даст вам координаты углов квадрата). – gnovice

ответ

0
x = [1 2 3]; 
    y = [11 22 33]'; 
    [X, Y] = meshgrid(x,y) 
X = 

    1  2  3 
    1  2  3 
    1  2  3 


Y = 

    11 11 11 
    22 22 22 
    33 33 33 
+0

Хорошая идея, но meshgrid не дает мне списка Элементов и их соответствующих точек. – Graviton

2

То, что вы в основном имеют 3 матрицы:

% define x_range and y_range as you wish 
[x, y] - meshgrid(x_range,y_range) 

z = some_function_of_x_and_y 

Теперь вы должны изменить эти три матрицы в вектор-строк:

sizes = size(x) 
x_row = reshape(x, sizes(1) * sizes(2), 1) 
y_row = reshape(y, sizes(1) * sizes(2), 1) 
z_row = reshape(z, sizes(1) * sizes(2), 1) 

и еще один из показателей:

indeces = [1:length(x_row)]' 

и теперь ваш список является:

result = [indeces x_row y_row z_row] 

Например:

x_range = [1,2,3]; 
y_range = [1,2,3]; 

>> [x,y] = meshgrid(x_range, y_range) 

x = 

    1  2  3 
    1  2  3 
    1  2  3 


y = 

    1  1  1 
    2  2  2 
    3  3  3 

>> z = x+y 

z = 

    2  3  4 
    3  4  5 
    4  5  6 

>> x_row = reshape(x, sizes(1) * sizes(2), 1); 
>> y_row = reshape(y, sizes(1) * sizes(2), 1); 
>> z_row = reshape(z, sizes(1) * sizes(2), 1); 

>> indeces = [1:length(x_row)]'; 

>> result = [indeces x_row y_row z_row] 

result = 

    1  1  1  2 
    2  1  2  3 
    3  1  3  4 
    4  2  1  3 
    5  2  2  4 
    6  2  3  5 
    7  3  1  4 
    8  3  2  5 
    9  3  3  6 

Теперь result держит в индексы первого столбца, и (x,y,z) в остальных столбцах. Вы должны иметь возможность извлекать то, что вы хотите оттуда.

+0

Ваш код не будет компилироваться, функция reshape не может работать. – Graviton

+0

вы правы ... исправлены! –

0

Здесь есть две возможности. Если точки на самом деле уже образуют правильную решетку на плоскости (x, y), и все, что вам нужно сделать, это разбить, какие точки идут туда, тогда сортировка решит вашу проблему. В частности, используйте сортировки на парах (x, y), а затем изменение, примененное к z, получит массив в правильную форму. Что-то примерно так ...

[xy,tags] = sortrows([x(:),y(:)]); 
z = reshape(z(tags),[n,m]); 

Однако, если данные разбросаны, то вам нужно использовать либо интерполяции, или поверхность подгонку. GRIDDATA решит проблему интерполяции, хотя она будет интерполировать только до границ ваших данных.

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

+0

Не уверен, работает ли ваш пример; Я не вижу, как путем изменения формы 'z' вы можете сгенерировать список элементов. – Graviton