首页 > 解决方案 > Octave - 为什么 surf 不起作用,而 trisurf 起作用?

问题描述

我可以绘制 trisurf 图表,但 surf 不起作用。

我究竟做错了什么?

pkg load statistics;
figure (1,'name','Matrix Map');
colormap('hot');
t = dlmread('C:\Map3D.csv');
tx =t(:,1);ty=t(:,2);tz=t(:,3);
tri = delaunay(tx,ty);
handle = surf(tx,ty,tz); #This does NOT work
#handle = trisurf(tri,tx,ty,tz);  #This does work

`错误:表面:行(Z)必须与长度(Y)相同,列(Z)必须与长度(X)相同

我的数据采用 CSV 格式(此处未显示逗号)

1   2   -0.32
2   2   0.33
3   2   0.39
4   2   0.09
5   2   0.14
1   2.5 -0.19
2   2.5 0.13
3   2.5 0.15
4   2.5 0.24
5   2.5 0.33
1   3   0.06
2   3   0.44
3   3   0.36
4   3   0.45
5   3   0.51
1   3.5 0.72
2   3.5 0.79
3   3.5 0.98
4   3.5 0.47
5   3.5 0.55
1   4   0.61
2   4   0.13
3   4   0.44
4   4   0.47
5   4   0.58
1   4.5 0.85

标签: matlaboctave

解决方案


surfMatlab 或 Octave 中的错误消息不同。

来自 Matlab 的错误消息:

Z 必须是矩阵,而不是标量或向量

问题在这里很清楚,因为您将Z(for you tz) 指定为向量。

来自 Octave 的错误消息:

表面:行 (Z) 必须与长度 (Y) 相同,列 (Z) 必须与长度 (X) 相同

您在这里错了,因为在您的示例中,列 (Z) = 1,但长度 (X) = 26,所以这里是错误的。

这样做的后果之一是,surf您的网格上不能有“洞”或未定义的点。在您的情况下,您有一个从 1 到 5 的 X 网格和一个从 2 到 4.5 的 Y 网格,但未定义坐标点 (2, 4.5)。


@Luis Mendo、Matlab 和 Octave 确实允许原型surf(matrix_x, matrix_y, matrix_z),但第三个参数matrix_z仍然必须是矩阵(不是标量或向量)。显然,只有一行或一列的矩阵不被视为矩阵。


为了解决这个问题,我建议如下:

tx = 1:5; % tx is a vector of length 5
ty = 2:0.5:4.5; % ty is a vector of length 6
tz = [-0.32 0.33 0.39 0.09 0.14;
      -0.19 0.13 0.15 0.24 0.33;
       0.06 0.44 0.36 0.45 0.51;
       0.72 0.79 0.98 0.47 0.55;
       0.61 0.13 0.44 0.47 0.58;
       0.85 0.   0.   0.   0.]; % tz is a matrix of size 6*5
surf(tx,ty,tz);

请注意,我必须在未定义网格的点处发明一些值,0.但您可以使用您喜欢的值进行更改。


推荐阅读