声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4060|回复: 11

[编程技巧] 离散点空间曲面拟合求助

[复制链接]
发表于 2009-2-24 00:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

使用道具 举报

发表于 2009-2-24 09:52 | 显示全部楼层

回复 楼主 huihuixy 的帖子

LH2必须是整数啊
另外搜索‘mesh,meshgrid'’看怎样对空间点(xi,yi,zi)进行插值或者拟合
 楼主| 发表于 2009-2-24 10:01 | 显示全部楼层
谢谢楼上的啦!我也这么觉得。再看下help呵呵
发表于 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 编辑 ]
 楼主| 发表于 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 ==> processor  at 112
surf(x1,y1,z1)

[ 本帖最后由 ChaChing 于 2009-2-24 21:05 编辑 ]
 楼主| 发表于 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 [m,n] = size(Z).那如果x,y均为矩阵的时候,是不是x,y,z的行列数相同就可以用surf来画三维图呢?我试了下下面的这段程序运行没问题的。能不能给个正式的说法呢?非常感谢各位了!
clc; clear
x=[0 1 3 2;0 1 2 3;0 1 2 3;0 1 2 3]; y=[0 0 0 0;1 1 1 1;2 2 2 2;3 3 3 3];
z=[2 5 3 7;3 2 5 5;4 3 3 7;5 3 6 8]; 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 编辑 ]
发表于 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 [m,n] = size(Z).那如果x,y均为矩阵的时候,是不是x,y,z的行列数相同就可以用surf来画三维图呢?...

Yes!

[ 本帖最后由 ChaChing 于 2009-2-24 11:47 编辑 ]
 楼主| 发表于 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= [0 0 0 0 0 0 0 0 0.0625 0.1250 0.1875 0.2500];
z= [0.5625 0.6250 0.6875 0.7500 0.8125 0.8750 0.9375 1.0000 1.0000 1.0000 1.0000  1.0000];   
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 编辑 ]
发表于 2009-2-24 16:22 | 显示全部楼层
load aaa
x1=aaa(:,1); y1=aaa(:,2); z1=aaa(:,3);
ti = 0:.1:1; [XI,YI] = 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
 楼主| 发表于 2009-2-24 17:07 | 显示全部楼层
chaching你太厉害了。不太熟悉load的用法,看help一知半解的。不过我用了一个数组将收集的数据进行存储,按照你的分组方式运行完全正确!谢谢你了!:@)
能不能再讲下这句程序的原理?我只知道是把每一列分配给一个矩阵:
x1=aaa(:,1); y1=aaa(:,2); z1=aaa(:,3);
初学matlab见笑了!非常感谢
发表于 2009-2-24 18:52 | 显示全部楼层

回复 10楼 huihuixy 的帖子

不熟悉没关系, 试试看就好!
aa=[1,2,3;4,5,6]
aa(1,:)
aa(:,2)

:表示全部

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

[ 本帖最后由 ChaChing 于 2009-2-24 19:05 编辑 ]
 楼主| 发表于 2009-2-24 20:29 | 显示全部楼层
谢谢您的回复,如要整理请便呵呵!以后多学习呵呵!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-22 19:27 , Processed in 0.069567 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表