Создать квадратную сетку с неупорядоченными векторами X, Y и Z - PullRequest
1 голос
/ 11 ноября 2009

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

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

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

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

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

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 11 ноября 2009

В основном у вас есть 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 голосов
/ 11 ноября 2009

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

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

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

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

0 голосов
/ 11 ноября 2009
    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...