我有一个矩阵,其中包含一组GPS坐标的温度值。所以我的矩阵看起来像这样:
Longitude Latitude Value
--------- -------- -----
12.345678 23.456789 25
12.345679 23.456790 26
%should be :
% x y z
等
我想将此矩阵转换为人类可见的情节,如彩色图(2D或3D),我该怎么做?
3D可以是这样的:
或只是这个的二维版本(从顶部的z轴看)。
我知道MATLAB有surf
和mesh
函数,但我无法弄清楚如何使用它们。
如果我打电话
surf(matrix(:,1) , matrix(:,2) , matrix(:,3));
我收到错误:
Error using surf (line 75)
Z must be a matrix, not a scalar or vector
提前感谢您的帮助!
P.S:如果有一个"填充"的功能也会很棒。插值的间隙(平滑,无论:))。由于我有离散数据,将它表示为连续函数会更美观。
P.S 2:我还想在z = 0平面中使用plot_google_map。
答案 0 :(得分:4)
一个令人惊讶的难以找到的答案。但我很幸运,其他人提出了几乎相同的问题here。
我发布了对我有用的答案:
x = matrix(:,1);
y = matrix(:,2);
z = matrix(:,3);
xi=linspace(min(x),max(x),30)
yi=linspace(min(y),max(y),30)
[XI YI]=meshgrid(xi,yi);
ZI = griddata(x,y,z,XI,YI);
contourf(XI,YI,ZI)
打印出漂亮的彩色地图。
答案 1 :(得分:1)
避免不必要地对数据进行网格化的一个选项是计算散乱数据点的Delaunay三角剖分,然后使用trisurf
之类的命令绘制数据。这是一个例子:
N=50;
x = 2*pi*rand(N,1);
y = 2*pi*rand(N,1);
z = sin(x).*sin(y);
matrix = [x y z];
tri = delaunay(matrix(:,1),matrix(:,2));
trisurf(tri,matrix(:,1),matrix(:,2),matrix(:,3))
shading interp
答案 2 :(得分:0)
假设您的矩阵为nx3
。然后您可以按如下方式创建网格:
xMin=min(myMat(:,1));
xMax=max(myMat(:,1));
yMin=min(myMat(:,2));
yMax=max(myMat(:,2));
step_x=0.5; %depends on your data
[xGrid,yGrid]=meshgrid(xMin:step_x:xMax,yMin:step_y:yMax);
现在,将您的数据放在第三列中的相应索引中,在新矩阵中说valMat
。
您现在可以使用surf
,如下所示:
surf(xGrid,yGrid,valMat);
如果您想要插值,可以将高斯内核(可能是3x3)与valMat
进行卷积。