离散点空间曲面拟合求助
求助: 实验测得一组空间点(xi,yi,zi),分别用3个一维数组x,y,z来保存测得的数据。 由于在进行二维曲面插值或拟合时,mesh或surf都要求数据为矩阵,故再将一维数组存成二维矩阵。但是老报错:??? Error using ==> mesh at 73
X, Y, Z, and C cannot be complex.
该如何解决?纳闷啊! 程序如下:
for r=1:LH2,for s=1:3
x1(r,s)=x(s+3*(r-1)); %将测得的x方向分量用一个lh2行,3列的二维数组来存放
y1(r,s)=y(s+3*(r-1)); z1(r,s)=z(s+3*(r-1));
end; end
figure(1); mesh(x1,y1,z1)
求得的LH2不是个整数,对于函数会有影响吗?
[ 本帖最后由 ChaChing 于 2010-8-3 09:57 编辑 ]
回复 楼主 huihuixy 的帖子
LH2必须是整数啊另外搜索‘mesh,meshgrid'’看怎样对空间点(xi,yi,zi)进行插值或者拟合 谢谢楼上的啦!我也这么觉得。再看下help呵呵 个人认为LH2不是个整数, 对for r=1:LH2是不会有问题的! 试下for r=1:2.5, r, end就知道!
从楼主的报错看, mesh(x,y,z)中x,y,z有复数吗? 以isreal(x)函数检查下!
还有LZ给的程序不会报错! 没LZ资料以rand产生
LH2=5.6; x=rand(15,1); y=rand(15,1); z=rand(15,1);
for r=1:LH2
for s=1:3, x1(r,s)=x(s+3*(r-1)); y1(r,s)=y(s+3*(r-1)); z1(r,s)=z(s+3*(r-1)); end
end; figure; mesh(x1,y1,z1)
[ 本帖最后由 ChaChing 于 2009-2-24 11:39 编辑 ] 感谢chaching,我将LH2强制转换为整型后,还是出现同样的错误。不得其解,可是我真的没有复数啊。全过程如下:
通过试验测距后,将距离转换成空间点的(x,y,z)坐标,即得到了一组空间点(xi,yi,zi),将这三个方向的坐标值分别存在3个向量x,y,z里面。由于在用mesh或surf画图时,要求输入必须为矩阵方式,故程序就是将其变成一个lh2行,3列的二维矩阵来存放。以便后面的拟合和插值。但是对于原始数据点画图就报错。
??? Error using ==> surf at 74
X, Y, Z, and C cannot be complex.
Error in ==> processorat 112
surf(x1,y1,z1)
[ 本帖最后由 ChaChing 于 2009-2-24 21:05 编辑 ] 还有,看了help surf,说surf(X,Y,Z) 中,If X and Y are vectors, length(X) = n and length(Y) = m, where = size(Z).那如果x,y均为矩阵的时候,是不是x,y,z的行列数相同就可以用surf来画三维图呢?我试了下下面的这段程序运行没问题的。能不能给个正式的说法呢?非常感谢各位了!
clc; clear
x=; y=;
z=; surf(x,y,z)
title('Original data Plot');%图形标注函数,图形标题
xlabel('X'), ylabel('Y'), zlabel('Z'),%x,y,z轴的标签
colormap, colorbar; %colormap颜色查看表
[ 本帖最后由 ChaChing 于 2009-2-24 21:07 编辑 ]
回复 5/6 楼 huihuixy 的帖子
LZ给的程序不会报错! 没头没尾很难debug建议LZ在surf(x1,y1,z1)指令前加save zzz x1 y1 z1
再上传资料, 我看看!
...If X and Y are vectors, length(X) = n and length(Y) = m,where = size(Z).那如果x,y均为矩阵的时候,是不是x,y,z的行列数相同就可以用surf来画三维图呢?...
Yes!
[ 本帖最后由 ChaChing 于 2009-2-24 11:47 编辑 ] %收集的空间点数据如下
% (xi,yi,zi)=[0 0 0.5625; 0 0 0.6250; 0 0 0.6875; 0 0 0.7500; 0 0 0.8125; 0 0 0.8750;
% 0 0 0.9375; 0 0 1.0000; 0 0.0625 1.0000; 0 0.1250 1.0000; 0 0.1875 1.0000; 0 0.2500 1.0000;
% 0 0.3125 1.0000; 0 0.3750 1.0000; 0 0.4375 1.0000; 0 0.5000 1.0000; 0 0.5625 1.0000; 0 0.6250 1.0000;
% 0 0.6875 1.0000; 0 0.7500 1.0000; 0 0.8125 1.0000; 0 0.8750 1.0000; 0 0.9375 1.0000; 0 1.0000 1.0000;
% 0.0625 1.0000 0.9375; 0.1250 1.0000 0.8750; 0.1875 1.0000 0.8125; 0.2500 1.0000 0.7500; 0.3125 1.0000 0.6875;
% 0.3750 1.0000 0.6250; 0.4375 1.0000 0.5625; 0.5000 1.0000 0.5000; 0.5625 1.0000 0.4375; 0.6250 1.0000 0.3750;
% 0.6875 1.0000 0.3125; 0.7500 1.0000 0.2500; 0.8125 1.0000 0.1875; 0.8750 1.0000 0.1250; 0.9375 1.0000 0.0625;
% 1.0000 1.0000 0; 1.0000 0.9375 0; 1.0000 0.8750 0; 1.0000 0.8125 0; 1.0000 0.7500 0;
% 1.0000 0.6875 0; 1.0000 0.6250 0; 1.0000 0.5625 0; 1.0000 0.5000 0; 1.0000 0.4375 0;
% 1.0000 0.3750 0; 1.0000 0.3125 0; 1.0000 0.2500 0; 1.0000 0.1875 0; 1.0000 0.1250 0; 1.0000 0.0625 0;
% 1.0000 0 0; 0.9375 0 0; 0.8750 0 0; 0.8125 0 0;0.7500 0 0;
% 0.6875 0 0; 0.6250 0 0; 0.5625 0 0; 0.5000 0 0]
%以一维向量形式存储
x= [ 0 0 0 0 0 0 0 0 0 0 0 0]; y= ;
z= ;
for r=1:4, for s=1:3
x1(r,s)=x(s+3*(r-1));y1(r,s)=y(s+3*(r-1)); z1(r,s)=z(s+3*(r-1));
end; end
figure(5); save zzz x1 y1 z1; surf(x1,y1,z1)
%思路错了吗?谢谢!
[ 本帖最后由 ChaChing 于 2009-2-24 21:24 编辑 ] load aaa
x1=aaa(:,1); y1=aaa(:,2); z1=aaa(:,3);
ti = 0:.1:1; = meshgrid(ti,ti); ZI = griddata(x1,y1,z1,XI,YI);
mesh(XI,YI,ZI), hold;
plot3(x1,y1,z1,'o'); xlabel('x'); ylabel('y'); zlabel('z'); hold off chaching你太厉害了。不太熟悉load的用法,看help一知半解的。不过我用了一个数组将收集的数据进行存储,按照你的分组方式运行完全正确!谢谢你了!:@)
能不能再讲下这句程序的原理?我只知道是把每一列分配给一个矩阵:
x1=aaa(:,1); y1=aaa(:,2); z1=aaa(:,3);
初学matlab见笑了!非常感谢
回复 10楼 huihuixy 的帖子
不熟悉没关系, 试试看就好!aa=
aa(1,:)
aa(:,2)
:表示全部
还有LZ问问题, 可能需再精进些! 不要自认为问题一定出在那一部分, 没头没尾很难debug的!
这个帖有点长且乱, 勿介意的话, 我会修一下!
[ 本帖最后由 ChaChing 于 2009-2-24 19:05 编辑 ] 谢谢您的回复,如要整理请便呵呵!以后多学习呵呵!
页:
[1]