1. 程式人生 > >批量讀取txt檔案並進行非線性擬合

批量讀取txt檔案並進行非線性擬合

在處理大量存於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 萬能實用的非線性曲線擬合方法

不過在使用這個方法時我也遇到了一些問題,我覺得還是挺有用的,雖然沒有從根本的演算法層面理解原因,但如果你遇到了與我同樣的問題,也可以試一試我的做法。

問題描述如下: 我最終得到的擬合結果

我想要的擬合影象如上圖,當我最開始敲程式碼執行的影象如下圖: 最初擬合影象

可笑的是我一開始還以為???matlab壞掉了?? 當然不是這樣,這裡涉及到上面程式碼中的beta0的取值問題 一開始我設定它為[1,1,1],因為我看的文章中說初值設定無所謂嘛。。 但matlab中的內建函式並沒有我想象中那麼強大,應該是區域性最優吧。。所以就結果很差。 然後我也是神經刀一般的就試了試改變初值,改為[1,-1,-1],然後就得到了我想要的結果,為什麼這麼選呢?因為我用origin擬合得到三個引數是這附近,哈哈,所以,嗯,美滋滋。

希望能夠幫到那個正在煩惱中的你