声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2983|回复: 16

[编程技巧] 关于最小二乘法的问题

[复制链接]
发表于 2007-6-1 23:37 | 显示全部楼层 |阅读模式

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

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

x
在’matlab在振动信号中的应用‘一书中有这用的个程序

%最小二乘法消除多项式趋势项
clear; clc; close all hidden
fni = input('消除多项式趋势项-输入数据文件名:','s');%input:提示用户进行键盘输入并获取输入内容
fid = fopen(fni,'r');%以只读方式打开fni文件
sf = fscanf(fid,'%f',1);%读入采样频率值
m = fscanf(fid,'%d',1);%读入拟合多项式阶数
fno = fscanf(fid,'%s',1);%读入输出数据名
x = fscanf(fid,'%f',inf);%读入时程数据存成列向量
status = fclose(fid);%关闭数据文件
n = length(x);%取信号数据长度
t = (0:1/sf:(n-1)/sf)';%建立离散时间列向量
a = polyfit(t,x,m);%计算趋势项的多项式待定系数向量a
y = x-polyval(a,t);%用x减去多项式系数a生成的趋势项
subplot(2,1,1); plot(t,x); grid on;
subplot(2,1,2); plot(t,y); grid on;
fid=fopen(fno,'w');
for k = 1:n
    fpintf(fid,'%f%f\n',t(k),y(k));
end
status = fclose(fid);


以上是程序

输入数据文件的内容如下:
250.0
4
out.txt
-4.57153e-01 -4.51660e-01 -4.80347e-01 -4.71802e-01
-4.96216e-01 -4.61426e-01 -4.73328e-01 -4.80652e-01
……

我将上面的数据保存在w.txt中,然后执行,结果没法运行。请读过这本书的朋友指教

[ 本帖最后由 ChaChing 于 2010-5-16 00:08 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-6-2 05:09 | 显示全部楼层
应该不能把数据保存在文件中作为输入,按照程序的要求,似乎应该在运行m文件后,用户手工逐步输入数据

[ 本帖最后由 ChaChing 于 2010-5-16 00:06 编辑 ]
 楼主| 发表于 2007-6-2 10:22 | 显示全部楼层
eight大哥能在答辩的今天还抽出时间来解答问题,令人佩服。

eight大哥,你说的好像不行。因为在命令: fni = input('消除多项式趋势项-输入数据文件名:','s');中提示的是输入文件名字的。

[ 本帖最后由 ChaChing 于 2010-5-16 00:17 编辑 ]
发表于 2007-6-2 11:58 | 显示全部楼层
我认为应该是按照以下顺序、内容不断输入,即不能把它们保存成一个 w.txt 文件,一次性输入:

250.0
4
out.txt
-4.57153e-01 -4.51660e-01 -4.80347e-01 -4.71802e-01
-4.96216e-01 -4.61426e-01 -4.73328e-01 -4.80652e-01
……

[ 本帖最后由 ChaChing 于 2010-5-16 00:18 编辑 ]
 楼主| 发表于 2007-6-2 12:27 | 显示全部楼层
试过了,不行。
输入一个数据,按回车就提示错误了
发表于 2007-6-2 13:31 | 显示全部楼层
保存为文件,然后输入文件名吧
我记得原来做过这个,就是这样的
 楼主| 发表于 2007-6-2 13:59 | 显示全部楼层
我保存文件了。不行啊! 不知道是不是文件内容输的不对。
文件内容:
250.0
4
out.txt
-4.57153e-01 -4.51660e-01 -4.80347e-01 -4.71802e-01
-4.96216e-01 -4.61426e-01 -4.73328e-01 -4.80652e-01
这样做是哪里出误了呢? 错误提示:
??? Error using ==> fscanf
Invalid fid.

[ 本帖最后由 ChaChing 于 2010-5-16 00:19 编辑 ]
发表于 2007-6-2 14:30 | 显示全部楼层
那我改天吧书借来,再看看了,现在都忘记了,我利用书上的程序作过,
 楼主| 发表于 2007-6-2 15:55 | 显示全部楼层
静候佳音。
也希望其他朋友能指点一下
发表于 2007-6-2 17:41 | 显示全部楼层
刚准备出发去吃饭,就挑你这个问题看了一下,应该这样:

“保存为一个文件然后再输入”是正确的,出错是否因为文件的路径问题呢?首先要保证保存的 txt 文件在当前目录(该路径最好不包含中文字)下,然后再试试吧。另外,估计用语句 fid = fopen(fni,'rt'); 较好,你试试吧。

之前没有细看,不好意思,这里也没有安装 matlab,所以不能测试,见谅

[ 本帖最后由 ChaChing 于 2010-5-16 00:20 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 2007-6-2 18:12 | 显示全部楼层
eight大哥你太客气了。
你说的问题不存在,输入文件是在当前目录中的,没有中文。
改为fid = fopen(fni,'rt');也是一样的提示:
??? Error using ==> fscanf
Invalid fid.
我觉得应该是我的输入文件的问题。是不是输入的内容有问题?

书上写的:
250.0
4
out.txt
-4.57153e-01 -4.51660e-01 -4.80347e-01 -4.71802e-01
-4.96216e-01 -4.61426e-01 -4.73328e-01 -4.80652e-01
……(注:该省略号是书上写的)
发表于 2007-6-2 23:00 | 显示全部楼层
由于你的错误是: ??? Error using ==> fscanf
Invalid fid

所以,应该跟输入的内容无关,你试试调试一下,断点设置在 fopen 那句,结合 fopen 的返回值看看能否对该文件读取成功,按照错误来看似乎是读取文件不成功

[ 本帖最后由 ChaChing 于 2010-5-16 00:22 编辑 ]
 楼主| 发表于 2007-6-3 12:35 | 显示全部楼层
的确是没有读取文件,运行后fid=-1说明没有打开文件。

[ 本帖最后由 ChaChing 于 2010-5-16 00:22 编辑 ]
发表于 2007-6-3 18:35 | 显示全部楼层
你是否忘记输入后缀名了?

[ 本帖最后由 ChaChing 于 2010-5-16 00:23 编辑 ]
 楼主| 发表于 2007-6-3 19:54 | 显示全部楼层
:@L 果然是这样的。
谢谢eight 大哥了
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-9-21 21:59 , Processed in 0.066700 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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