matlab - 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
解决方案
surf
Matlab 或 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.
但您可以使用您喜欢的值进行更改。
推荐阅读
- firebase - FireStore Flutter 多步查询
- json - 用 jq 格式化时间
- reactjs - TypeError._this.props.addPerson 不是函数
- ansible - 如何让 Ansible 仅运行 1 次步骤
- hl7-fhir - 在 FHIR 结构中记录问题和答案
- graphql - Graphql,如何返回空数组而不是null
- c# - 如何使用 C# 和 SQL 将表值参数传递给用户定义的数据表
- javascript - 具有不同级别 DIV 的简单测验
- batch-file - Open URLs with given string | strip one character from string on each URL run
- java - 通知 textview 中更改了哪些文本