Отсечение сетки/поверхности

Я работаю с некоторыми антарктическими данными DEM в Matlab. Итак, мне удалось сгенерировать красивую сетку с помощью следующего базового кода:

load (Data.xyz)
X = Data(:,1);
Y = Data(:,2);
Z = Data(:,3);
xr = unique(X);
yr = unique(Y);
gz = zeros(length(yr),length(xr));
gz = griddata(X,Y,Z,xr,yr');

figure
mesh(xr,yr,gz);
hold on
contour3(xr,yr,gz,'k-');
hold off

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

  1. Приведенный выше код занимает много времени. Согласитесь, что ЦМР для Антарктиды имеет большой размер и медленное время отклика кода не обязательно означает, что он неверен. Однако я совершенно не могу запустить этот код на своем ноутбуке (2,5 ГГц / 4 ГБ) - он такой медленный. Мне интересно, есть ли другие способы создания сетки, которые быстрее и эффективнее.

  2. Вторая проблема заключается в том, что приведенный выше «Data.xyz» содержит данные ЦМР по всей Антарктиде. После создания сетки я хочу обрезать ее в зависимости от местоположения. Скажем, например, я хочу извлечь данные сетки для области, ограниченной x1, y1, x2, y2, x3, y3 и x4, y4. Как мне это сделать? Я нигде не смог найти подходящую функцию или инструмент или какой-либо пользовательский скрипт, который позволил бы мне это сделать. Можно ли вырезать сетку в матлабе?

Я использую Matlab 2012a, и у меня нет доступа к инструментарию сопоставления. Какие-либо предложения???


person user3662179    schedule 27.06.2014    source источник
comment
Это набор данных Bedmap2, с которым вы работаете? Если это так, используйте набор инструментов Bedmap2 для Matlab, для которого не требуется набор инструментов Mapping Toolbox от Matlab. bedmap2_data позволяет легко импортировать подмножество данных в полном разрешении, привязанных к указанному географическому региону. Или вы можете использовать [bedmap2_interp](mathworks.com/matlabcentral/fileexchange/   -  person    schedule 09.04.2015


Ответы (1)


1. Я просто хотел бы уточнить, что вы хотите, чтобы ваш код делал. Для данных X,Y,Z я бы предположил, что это точки (X,Y) (не выбранные на сетке), каждая из которых связана с некоторой высотой Z.

Когда вы звоните

gz = griddata(X,Y,Z,xr,yr');

Вы говорите, что каждая возможная пара (xr(i),yr(j)) - это места в вашей сетке, где вы хотите взять образец поверхности для создания своей сетки. Я могу ошибаться, но я не думаю, что это то, что вы хотите? Я думаю, вы бы предпочли сэмплировать в точках с одинаковым интервалом вместо того, чтобы использовать что-то вроде...

xr = min(X):spacing:max(X);
yr = min(Y):spacing:max(Y);   
gz = griddata(X,Y,Z,xr,yr');  % ' is for the transpose
mesh(xr,yr,gz);

Где spacing разумное число для масштаба ваших данных. В том виде, в котором сейчас находится ваш код, вы можете брать гораздо больше образцов, чем хотите, и, возможно, поэтому ваш код занимает так много времени.

Для 2. Я думаю, вы могли бы получить цикл for, чтобы просто добавить точки внутри интересующей области к трем новым спискам значений X, Y, Z. Если ваша область прямоугольная, ограниченная x_left,x_right и y_left,y_right...

Xnew = []; Ynew = []; Znew = [];
for i = 1:length(X)
  if ( x_left<X(i) )&&( X(i)<x_right )&&( y_left<Y(i) )&&( Y(i)<y_right )
    Xew = [Xnew, X(i)];
    Ynew = [Ynew, Y(i)];
    Znew = [Znew, Z(i)];
  end
end
person eigenchris    schedule 28.06.2014
comment
Данные охватывают диапазон от -33333000 до +33333000 единиц (в проекции UTM). Так что, если я, скажем, сделаю сетку на 1000 (1 км), у нее все равно будет огромное количество ячеек сетки. Я попробовал ваши команды интервалов, но процесс по-прежнему зависает в данных сетки на моем ноутбуке. Есть ли альтернатива использованию данных сетки? Данные составляют ~ 250 МБ, с несколькими нулевыми значениями, обозначенными -9999, которые я заменил на NaN. - person user3662179; 30.06.2014
comment
Все, что я могу предложить, это попробовать очень большой интервал для всего набора данных и использовать более мелкий интервал, когда вы хотите изучить конкретную область. Более мелкие детали (1000 км), вероятно, не заметны при просмотре всего набора данных в виде сетки. Возможно, попробуйте для начала что-то вроде 100 000 км, а затем посмотрите, как меняются детали при переходе к более точному разрешению. - person eigenchris; 03.07.2014