2015-10-01 2 views
0

Когда я подмножу массив, построенный из meshgrid, я не могу решить, как сохранить его структуру meshgrid. Таким образом, вы не можете использовать его при вызове mesh или surface. Я продемонстрирую это в моем примере построения единичной сферы.Сохранять структуру meshgrid при подмножестве meshgrid

Возможные альтернативные названия для этого вопроса:

  1. Как сделать верхнюю половину meshgrid области с нуля в Matlab?
  2. Как вы используете сетку для построения подмножества meshgrid?

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

[x, y, z] = sphere(100) 
mesh(x, y, z) 

Используя уравнение для сферы:

equation of sphere

Определение meshgrid и z быть:

x = linspace(-1, 1, 201); 
y = linspace(-1, 1, 201); 
[x, y] = meshgrid(x, y); 
z = sqrt(1 - x.^2 - y.^2); 

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

Вызов mesh теперь возвращает ошибку:

>> mesh(x, y, z) 
Error using mesh (line 58) 
X, Y, Z, and C cannot be complex. 

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

% get logical vector index where real z is 
LI = z == real(z) 

x = x(LI) 
y = y(LI) 
z = z(LI) 

Но теперь x, y и z больше не являются 3d-массивов, а также по вызову mesh дает еще одну ошибку:

>> mesh(x, y, z) 
Error using mesh (line 58) 
Z must be a matrix, not a scalar or vector. 

Итак, я вообще не знаю, как сохранить структуру meshgrid при подмножестве данных. Следовательно, я не могу сгенерировать верхнюю половину этой сферы с нуля.

ответ

3

В общем, вы можете «исключить» значения из графика при сохранении структуры матрицы, используя NaN значение. В вашем случае попробуйте следующее:

LI = z == real(z); 
z(~LI) = NaN; 
mesh(x,y,z); 
+0

Спасибо. Теперь я сталкиваюсь с другой проблемой при попытке использовать 'slice': координаты входных точек должны быть конечными; Inf и NaN не допускаются. – Alex

+0

Использование NaN не является идеальным в любом случае. Возможно, вы могли бы взглянуть на эту [ссылку] (http://de.mathworks.com/matlabcentral/newsreader/view_thread/169373), чтобы узнать, как правильно сгенерировать сферу, используя сферическую координату phi и theta. Чтобы создать половину сферы, я бы изменил код в ссылке на 'phi = linspace (0, pi/2,30);' – MinF

+0

К сожалению, сферические координаты не помогают мне с данными, которые у меня есть. Возвращаясь к примеру сферы, я думаю, что было бы трудно получить поверхность, сформированную путем разрезания сферы с использованием диагональной плоскости. Концептуально лучший способ сделать это - использовать подмножество, но если вы выполните подмножество, оно разрушит структуру сетки. – Alex

Смежные вопросы