批量讀取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擬合得到三個引數是這附近,哈哈,所以,嗯,美滋滋。
希望能夠幫到那個正在煩惱中的你