1. 程式人生 > >matlab中在可變路徑下儘快自動順序讀取或命名檔案

matlab中在可變路徑下儘快自動順序讀取或命名檔案

matlab中常需要順序讀取或命名檔案(或資料夾),以讀取檔案為例。檔案存放在“E:\disk\Data”中,其中又有50個子資料夾,從“s1”到“s50”,每個資料夾裡有10張圖片,從“1.jpg”到“10.jpg”。希望讀取前40個子資料夾,每個資料夾只讀取前5張圖片作為訓練集,後5張作為測試集,程式如下:
addpath ('E:\disk\Data');
ndocument=40;
npicture=5;
train=0;%取0時讀取前5張,取其它值讀取後5張

for i=1:ndocument
    i1=mod(i,10); %獲得資料夾號碼個位,mod(x,y)取模,取x/y的餘數,x和y符號不同時,取y的符號
    i0=char(i/10);%在下面的程式碼中,相當於得到資料夾號碼十位(我個人理解i0為i/10整數部分)
    docPath='E:\disk\Data\s';
    
    if(i0~=0)%判斷十位是否為零,如果不為零,路徑中加上十位
    docPath=strcat(docPath,'0'+i0);%strcat連線的是char型,‘0’為數字0的ASCII碼(48),再加上i0(即資料夾號碼的十位),即為資料夾號碼十位的ASCII碼
    end
    docPath=strcat(docPath,'0'+i1);%加上資料夾號碼的個位,獲得資料夾號碼路徑
    docPath=strcat(docPath,'\');
    
    Path=docPath;
    for j=1:npicture
        picPath=Path;
        if train==0;%讀取前5張
            picPath=strcat(picPath,'0'+j);
        else %讀取後5張
            picPath=strcat(picPath,num2str(5+j));%num2str 將數字轉換成char型
        end
        
        picPath=strcat(picPath,'.pgm');
        img=imread(picPath);
    end
         
end


其中,1.需要掌握取餘運算mod(x,y),此外rem(x,y)也為取餘,但兩者有區別:當x和y的正負號一樣的時候,兩個函式結果是等同的;當x和y的符號不同時,rem函式結果的符號和x的一樣,而mod和y一樣。先將兩個數x、y看作是正數,作除法運算
①能整除時,其值為0
②不能整除時,其值=除數×(整商+1)-被除數
例:mod(36,-10)=-4
即:36除以10的整數商為3,加1後為4;其與除數之積為40;再與被數之差為(40-36=4);取除數的符號。所以值為-4。
例:mod(9,1.2)=0.6; 
2.程式識別資料夾號碼為‘s1’、‘s2’、's3'、...........、's10'、's11'、.........、's40'在我以前編號檔案或資料夾時,如果是三位數,編號為‘001’、‘002’、.......、‘010’、‘011’、......、‘100’、‘101’即編號位數必須相同,前面有無效的'0',正是由於沒有用好:strcat(docPath,'0'+i0);%strcat連線的是char型,‘0’為數字0的ASCII碼(48),再加上i0(即資料夾號碼的十位),即為資料夾號碼十位的ASCII碼
利用char字元的ASCII碼,可直接編號,例如i0是3,那麼'0'+i0為51,ASCII碼中51代表字元‘3’,即顯示3。此外,要想獲得字元的ASCII碼,可利用函式 abs(),例如,輸入abs('0'),得到0的ASCII碼為48,輸入abs('a'),得到字a的ASCII碼為97。