我有以下问题。 我有一张表格,其中包含在矩阵A(a,b,c)中读取的实验数据,如下所示:
4.00000 7.00000 0.09035
4.00000 6.00000 0.02632
4.00000 5.00000 0.01184
4.00000 4.00000 0.30728
4.00000 3.00000 0.16022
4.00000 2.00000 0.01734
3.00000 6.00000 0.05817
3.00000 5.00000 0.02296
3.00000 4.00000 0.00000
3.00000 3.00000 0.22576
3.00000 2.00000 0.08331
3.00000 1.50000 0.00297
2.00000 6.00000 0.00000
2.00000 5.00000 0.05184
2.00000 4.00000 0.01883
2.00000 3.00000 0.00000
2.00000 2.00000 0.10719
2.00000 1.50000 0.06689
我的实际问题是,我不知道如何用网格做三维图。 Wioth plot3d()我只是一条曲线,对我来说没用。 就像回答较旧的问题一样,解决方案应该是这样的:
X = reshape(A(:,1),m,n);
Y = reshape(A(:,2),m,n); % might be reshape(data(:,2),n,m)
Z = reshape(A(:,3),m,n);
mesh(X,Y,Z);
解释: 在这种情况下,假设您在Y中有m个唯一值,在X中有n个唯一值。您可能必须在调用网格(X',Y',Z)或类似的东西时将这些值转置。 / p>
据我所知,解释m和n必须是我3d图中x和y方向的网格点数量。我遇到的问题是,例如,与x方向上的一个网格点对应的y方向上的网格点可以从一个点变为另一个点。
用
aa=unique(a)
bb=unique(b)
lengthaa=length(aa)
lengthbb=length(bb)
我得到了我的3d图的最终网格尺度(n,m)=((lengthaa),长度(bb)),但是当我想要重塑A像我上面写的那样,我当然得到一条错误信息像这样:
octave:20> x = reshape (A(:,1),clength,dlength)
error: reshape: can't reshape 36x1 array to 6x12 array
现在,我甚至不知道该搜索什么。你能帮忙吗? :)
编辑: 现在我更进一步: 与
[aaa,bbb]=meshgrid(aa,bb)
我的斧头正确。现在我必须以正确的方式订购我的数据。
Edit2:问题是,我现在有网格点,我没有任何数据。这就是原因,为什么重塑不起作用。有什么帮助吗?
答案 0 :(得分:3)
要生成缺失点,您可以插入数据。我做了一个类似问题的快速测试:
# Test script for http://stackoverflow.com/questions/19604387/octave-3d-plot-with-mesh-out-of-experimental-data
# Trygve Utstumo, 2013-10-28
data = [
4.00000 7.00000 0.09035
4.00000 6.00000 0.02632
4.00000 5.00000 0.01184
4.00000 4.00000 0.30728
4.00000 3.00000 0.16022
4.00000 2.00000 0.01734
3.00000 6.00000 0.05817
3.00000 5.00000 0.02296
3.00000 4.00000 0.00000
3.00000 3.00000 0.22576
3.00000 2.00000 0.08331
3.00000 1.50000 0.00297
2.00000 6.00000 0.00000
2.00000 5.00000 0.05184
2.00000 4.00000 0.01883
2.00000 3.00000 0.00000
2.00000 2.00000 0.10719
2.00000 1.50000 0.06689
];
# Evenly spaced axis, hacked to this dataset
xi = min(data(:,1)):max(data(:,1));
yi = min(data(:,2)):0.5:max(data(:,2));
zi = griddata( data(:,1),data(:,2),data(:,3),xi,yi);
mesh( xi, yi, zi )
print("figure.png")
pause()