在处理大量存于txt文件中的离散数据过程中,低效率的一个一个在origin中拟合,受够了,于是想在matlab中写一个可以一劳永逸的程序,于是有了下面的内容。
#批量读取txt文件 不多说,直接上代码啦
filepath=uigetdir({},'选中文件夹'); %选中指定文件夹 filename=dir([filepath,'\*.txt']); %保存文件夹下指定后缀名的所有文件名到filename filepath=[filepath,'\']; %字符串拼接 for i=1:length(filename) x(:,:,i)=load([filepath,filename(i).name]); end %读取该文件夹下所有指定类型文件,存到多维矩阵x中为什么要拼接字符‘\’呢? 因为执行uigetdir后filepath为D\数据 执行dir后filename内容为12.txt 所以必须要加上\才可以执行load
当然这段代码可不仅仅只能用来读取txt文件,改动第二行中的’txt’为‘你想要的后缀名’,再将第五行中的读取程序load改成符合matlab读取规则的函数就可以了
#非线性拟合 这一部分内容要感谢博主大佬的主页链接 用了他的方法很快就得到了我想要的拟合结果,而且某种意义上真的是万能的啊
在上文中我得到了文件夹中所有的txt文件的值,并存放在一个m×n×i的矩阵中,m,n为一个txt文件中的矩阵大小,i为txt文件个数。 你可以自由的读取其中任意一个文件,并进行任意你想进行的处理。如:(此段针对真小白,大佬请无视) I=x(:,:,j); j代表第几个文件。 [a,b]=size(I); 得到I的行列数量 X=zeros(a,1); Y=zeros(a,1); 定义新的矩阵 i=1:a; X(i,1)=I(i,1); Y(i,1)=I(i,3); 将你想要的数据提取出来
然后就可以进行任意你想进行的拟合啦。
拟合部分代码
myfunc=inline('beta(1).*exp(beta(2).*X1)+beta(3)','beta','X1'); beta0=[1,-1,-1]; beta=nlinfit(X1,Y1,myfunc,beta0); x1=0.03:0.001:0.2; Y2=beta(1).*exp(beta(2).*x1)+beta(3);这是我做的形如y=a*exp(b*x)+c的拟合,具体更加详细的内容还是看上文我推荐的大佬博客吧! matlab 万能实用的非线性曲线拟合方法
不过在使用这个方法时我也遇到了一些问题,我觉得还是挺有用的,虽然没有从根本的算法层面理解原因,但如果你遇到了与我同样的问题,也可以试一试我的做法。
问题描述如下:
我想要的拟合图像如上图,当我最开始敲代码运行的图像如下图:
这里涉及到上面代码中的beta0的取值问题 一开始我设置它为[1,1,1],结果很差。改变初值,改为[1,-1,-1],然后就得到了我想要的结果,为什么这么选呢?因为我用origin拟合得到三个参数是这附近。