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\’);
% 先手工构造一个1×512大小的矩阵
raw_data = [1:1:512] ;
while feof(file_id) == 0
% 这就是大名顶顶的fread了,数据类型是int16,每次读入512个数
% raw_array每次都是512×1的矩阵,ele_count为读入的数的个数(正常情况下应为512)
[row_array, ele_count] = fread(file_id, 512, \’int16\’) ;
if ele_count < 512 % elecount < 512代表数据不够,已经到了文件的结尾
break ;
else
% 将512×1的row_array转置一下,变为1×512的矩阵
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)即可