Matlab如何循環讀取文件


循環讀取圖片第一種方法①List =dir('*.jpg');
%如需其它圖片格式支持,可以自己【重載dir()】函數,實現查找所有圖片文件的功能,
%如果圖片是其它路徑,可以用 ["路徑" ".擴展名"] 字符串來實現。
k =length(dList);
for i=1:1:k
image_data{i}=imread(dList(i).name);
end
第二種方法②I=ones(8,5);
q=reshape(49:56,8,1);
I(:,1)=q;
I(:,2)='.';
I(:,3)='b';
I(:,4)='m';
I(:,5)='p';
L=setstr(I); %將ASCII碼轉為字符串;
第三種方法③
images= [ ];
for i= 1:M
str= strcat ('D: \MATLAB\work\', int2str(i) , ’.bmp’) ; % 連接字符串形成圖像的文件名。
img= imread(str);
[rows cols]= size(img) ; % 獲得圖像的行和列值。
temp= reshape ( img, rows*cols, 1) ; % 創建一個(N1*N2)×1 矩陣。
images= [ images temp ]; % 完成循環后的images 矩陣是一個(N 13 N 2) ×M 矩陣。
end
上述三種方法中,第一種主要利用dir()函數,獲得文件夾內圖片的信息,然后創建一個元胞數組,將圖片文件信息送入元胞數組
第二種方法是已知圖片文件名,並且按數字順序排列,然后利用數字和字符串之間的轉換來進行。
第三種方法利用字符串連接函數strcat()函數巧妙運用循環實現圖片的連續讀入。
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

文件名規律(比如qnl260.200,qnl260.201,qnl260.202~~qnl260.300)的多個二進制文件進行同樣的處理,
問題是怎么循環的讀入這些文件,就是想編個程序讓它讀取第一個數據處理,然后讀取第二個數據處理,以此類推
file=dir('*.txt');
data=cell(1,size(file,1));
for    i=1:size(file,1);
       data{1,i}=read(file(i).name);
end

獲取路徑的文件索引后讀入
具體的read模式可以參見help
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 現在假定有一個數據文件叫data.dat,它的前面2k是存放參數的,我們做數據處理的時候需要跳過去,后面的數據是16位整數類型的,每組數據有512個。現在要把該數據文

件的所有數據讀入一個nx512的矩陣中,n的個數不定,根據數據文件中的數據而定。
用.m腳本的方式編寫如下:
% deal data from specified data file
clear ;
data_fname = 'data.dat' ; % 這里是文件名
jump_distance = 2048 ;    % 這里是跳過的字節數
% 打開方式為二進制打開,其實'r'就行,matlab是默認二進制形式打開文件的
file_id = fopen(data_fname, 'rb');
% 從文件開始跳過jump_distance個字節
fseek(file_id, jump_distance, 'bof');
% 先手工構造一個1x512大小的矩陣
raw_data = [1:1:512] ;
while feof(file_id) == 0
    % 這就是大名頂頂的fread了,數據類型是int16,每次讀入512個數
    % raw_array每次都是512x1的矩陣,ele_count為讀入的數的個數(正常情況下應為512)
    [row_array, ele_count] = fread(file_id, 512, 'int16') ;
    if ele_count < 512 % elecount < 512代表數據不夠,已經到了文件的結尾
        break ;
    else
        % 將512x1的row_array轉置一下,變為1x512的矩陣
        row_array = row_array'  ;
        % 然后,將row_array追加到raw_data中
        raw_data = [raw_data; row_array] ;
    end
end
% get off the first line [1:1:512]
% 這里就是要把raw_data的第一行數據手工構造的那行數據給去掉,剩下的就都是文件中的數據了
raw_data(1,:)=[] ;
% 關閉文件
fclose(file_id);
% delete other usless vars
% 這里是把用過的變量都刪除掉,免得workspace里面亂七八糟的什么都有,這是個好習慣,呵呵。
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
matlab中讀取某個文件夾下所有數據文件
怎么用matlab讀取多個數據文件?

1:如果文件名規則
% 文件目錄:
my_dir=' /home/my_calculation1/test1/';
%文件名前綴
my_pre_T='test';%文件數目fnum =1:32; %Read filesfor i=1:length(fnum) filename = [my_dir,prefix_T1 num2str(fnum(i))]; 然后dlmread,fopen等操作就不需詳寫

了!與單個文件一樣。
end
 
2:文件夾數據批量讀取的問題,命名無規則
在windows下很簡單,ls函數便可以得到一個包含所有文件名的字符矩陣。可惜在unix下得到的是個字符行向量。當然,處理下也可以批量讀取數據文件,不過不想再寫了。

因為另外一個函數也可以實現批量處理數據文件的功能。即dir函數
LS displays the results of the 'ls' command on UNIX.
On UNIX, LS returns acharacter row vectorof filenames separated by tab and space characters.
On Windows, LS returns anm-by-n character array of filenames, where m is the number of filenames and n is the number of characters in the longest

filename found. Filenames shorter than n characters are padded with space characters.
下面介紹下使用dir函數讀取文件夾中文件的程序
2.1 讀取所有擴展名為.dat的數據文件,並進行處理。
matlab中,也可以使用通配符的。下面就來展示下:
現在有一個文件夾里面有50個的.dat文件.每個文件大概三萬行.兩列,第一列是字符串,第二列是浮點數字.批量讀取這個文件夾里的.dat文件的第二列。讀取完以后的數組變

量名就是.dat的文件名
假定.dat文件在/home/my_calculation1/test1/ 文件夾下,文件名符合matlab變量名的命名規則,要讀取第二列的浮點數字為數組並以文件名為變量名。

mydir='/home/my_calculation1/test1/';
temp1=dir([mydir,'*.dat']);
num_temp1=length(temp1);
for i1=1:num_temp1
filename=[mydir,temp1(i1).name];
temp=dlmread(filename,'',0,1);
eval([temp1(i1).name(1:end-4),'=temp;'])
dlmread,fopen等操作就不需詳寫了!與單個文件一樣。end
注意:如果直接使用 temp1=dir(mydir]);讀取文件夾下所有文件,應當從第三個開始才是目錄下的文件。另外,使用dir還可以遍歷一個文件夾下的所有子文件夾。 1、利用

dir(外層文件夾)獲取子文件夾;
2、利用dir(子文件夾)獲取子文件夾中的文件信息;
3、遍歷文件,做處理;對於遍歷文件夾,也可以使用mathworks網站上的函數dirr輕松搞定。下面是飲水思源論壇上的做法。沒有進行整理。敬請原諒。
論壇地址:

現在有個文件夾data中的數據想要批量處理,
而data中有多個子文件夾,名字分別為01001,01002,…,每個子文件夾中有多個數據,假設為ECG.txt,PCG.txt,…。
現在我想要依次讀取01001中的各數據進行處理,然后讀取01002中的進行處理,依此類推,直到將data文件夾中的數據全都處理完。
我知道在labview中可以把文件夾的名字弄成字符拼接后可以不斷的循環讀取,不知道在matlab中如何實現這樣的功能?


因為這幾天連着做實驗,今天才有時間上網看一下,
回復比較晚。剛剛下載了名為dirr.m的文件。LIST=DIRR('D:\data');可以實現將data中的子文件夾全都讀取進來。存為一個名為LIST的struct。
以01001文件夾中的數據為例,可以知道每個數據的位置了,可是我應該如何讀取出來呢?
例如LIST(1).isdir(1)中的是CPT.txt,但是我只能得到一個存有該文件名字和大小等的struct格式,
不知道應該如何讀入該數據。eval命令不知道該如何用?試了一下eval(LIST(1).isdir(1)),出現錯誤,
說是該命令不能做struct類。

 cottonsugar (棉花糖) 於 2009年09月23日18:25:30 星期三) 提到:
fl=dirr('./');nl=length(fl);for i=1:nl fname=fl(i).name; if strcmp(fname,'XXXX') str=['load ',fname];eval(str);enden

最后的關鍵就在於load那句了。str=['load(D:\data\',fl(i).name,'\',fname,')'];因為load在用的時候是:load('D:\data\01001\ECG.txt');
現在我無法加上那個括號里面的一撇',所以總是無法把數據load上。請問這個一撇怎么加上呢?謝謝啦。我改了以后的程序如下:
fl=dirr('D:\data');nl=length(fl);nl2=length(fl(1).isdir);
for i=1:nl for j=1:nl2 fname=fl(i).isdir(j).name;
if strcmp(fname,'ECG.txt') str=['load(D:\data\',fl(i).name,'\',fname,')'];eval(str);
end
end
end

比如你想load一個文件 load('d:\ecg.txt');
用string來表示就是str=['load(''d:\ecg.txt'');'];然后再eval(str)即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM