我正在使用Matlab中的一些南极DEM数据。所以,我已经能够使用以下基本代码生成漂亮的网格物体:
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
现在我有几个问题,尽管在过去的几天里一直在观看所有论坛并且日夜搜索谷歌,但我仍然无法回答这些问题。我希望你们所有的专家都能给我一些建议。我的问题是:
上面的代码需要花费很多时间。同意南极洲的DEM规模较大,代码响应时间慢并不一定意味着其不正确。但是,我完全无法在笔记本电脑上运行此代码(2.5 GHz / 4GB) - 它太慢了。我想知道是否有其他方法来生成更快更有效的网格。
第二个问题是上面的" Data.xyz"包含来自所有南极洲的DEM数据。生成网格后,我想根据位置剪切它。比方说,例如,我想提取由x1,y1,x2,y2,x3,y3和x4,y4限制的区域的网格数据。我该怎么做呢?我无法在任何地方找到合适的功能或工具或任何用户脚本,这样我就可以这样做。是否可以在matlab中剪切网格?
我正在运行Matlab 2012a,而且我无法访问映射工具箱。任何建议???
答案 0 :(得分:0)
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