huihuixy 发表于 2009-2-24 00:04

离散点空间曲面拟合求助

求助: 实验测得一组空间点(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 编辑 ]

qingqing5638 发表于 2009-2-24 09:52

回复 楼主 huihuixy 的帖子

LH2必须是整数啊
另外搜索‘mesh,meshgrid'’看怎样对空间点(xi,yi,zi)进行插值或者拟合

huihuixy 发表于 2009-2-24 10:01

谢谢楼上的啦!我也这么觉得。再看下help呵呵

ChaChing 发表于 2009-2-24 10:33

个人认为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 编辑 ]

huihuixy 发表于 2009-2-24 11:00

感谢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 编辑 ]

huihuixy 发表于 2009-2-24 11:06

还有,看了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 编辑 ]

ChaChing 发表于 2009-2-24 11:44

回复 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 编辑 ]

huihuixy 发表于 2009-2-24 14:11

%收集的空间点数据如下
% (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 编辑 ]

ChaChing 发表于 2009-2-24 16:22

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

huihuixy 发表于 2009-2-24 17:07

chaching你太厉害了。不太熟悉load的用法,看help一知半解的。不过我用了一个数组将收集的数据进行存储,按照你的分组方式运行完全正确!谢谢你了!:@)
能不能再讲下这句程序的原理?我只知道是把每一列分配给一个矩阵:
x1=aaa(:,1); y1=aaa(:,2); z1=aaa(:,3);
初学matlab见笑了!非常感谢

ChaChing 发表于 2009-2-24 18:52

回复 10楼 huihuixy 的帖子

不熟悉没关系, 试试看就好!
aa=
aa(1,:)
aa(:,2)

:表示全部

还有LZ问问题, 可能需再精进些! 不要自认为问题一定出在那一部分, 没头没尾很难debug的!
这个帖有点长且乱, 勿介意的话, 我会修一下!

[ 本帖最后由 ChaChing 于 2009-2-24 19:05 编辑 ]

huihuixy 发表于 2009-2-24 20:29

谢谢您的回复,如要整理请便呵呵!以后多学习呵呵!
页: [1]
查看完整版本: 离散点空间曲面拟合求助