后知后觉 发表于 2007-6-1 23:37

关于最小二乘法的问题

在’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 编辑 ]

eight 发表于 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 编辑 ]

eight 发表于 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

试过了,不行。
输入一个数据,按回车就提示错误了

无水1324 发表于 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 编辑 ]

无水1324 发表于 2007-6-2 14:30

那我改天吧书借来,再看看了,现在都忘记了,我利用书上的程序作过,

后知后觉 发表于 2007-6-2 15:55

静候佳音。
也希望其他朋友能指点一下

eight 发表于 2007-6-2 17:41

刚准备出发去吃饭,就挑你这个问题看了一下,应该这样:

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

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

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

后知后觉 发表于 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
……(注:该省略号是书上写的)

eight 发表于 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 编辑 ]

eight 发表于 2007-6-3 18:35

你是否忘记输入后缀名了?

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

后知后觉 发表于 2007-6-3 19:54

:@L 果然是这样的。
谢谢eight 大哥了
页: [1] 2
查看完整版本: 关于最小二乘法的问题