对MATLAB读取同一路径下多个txt或mat文件方法探讨

来源:互联网 发布:python 字符串求和 编辑:程序博客网 时间:2024/05/29 11:53
一、读取同一路径下所有txt文件的程序:
function data = readall_txt(path)
%   READALL_TXT    读取所有文件
%   DATA = READALL_TXT(PATH)读取路径PATH下的所有txt文件中的数据赋给data
%   txt文件中含有一个数据项
%   输出cell格式以免各txt中数据长度不同
%
%   原始版本:V1.0   作者:李鹏   时间:2009.04.04
A = dir(fullfile(path,'*.txt'));
% 读取后A的格式为      
%                   name  -- filename
%                   date  -- modification date
%                   bytes -- number of bytes allocated to the file
%                   isdir -- 1 if name is a directory and 0 if not
A = struct2cell(A);
num = size(A);
for k =0:num(2)-1
    x(k+1) = A(4*k+1);% 找出name序列
end
for k = 1:num(2)
    newpath = strcat(path,'\',x(k));
    data{k} = load(char(newpath));
end
% [EOF] readall_txt.m
下面用这个函数做一个小实验:
比如,我有三个txt文档,在路径E:\shuju下:
名字分别为123.txt,456.txt,789.txt
MATLAB命令窗口输入:
data = readall_txt(‘E:\shuju’);
我们可以检验结果,分别输入data{1},data{2},data{3}
可以看到已经把所有的数据都读出了,并且,虽然里面的数据长度不同,也没有任何问题
二、读取所有路径下所有mat文件的程序

这个程序弄了好长时间才出来的,呵呵,经过了很多实验,本想着应该和txt差不多,但是后来才发现,差距好大呢,我编写了两个版本,第一个是针对所有mat文件中只保存了一个变量的,第二个是针对所有mat文件中保存了多个变量的,我经过了数次实验了,结果证明是无误的,可能还会有其他不完善的地方,大家多多指教。
1.所有mat文件只有一个变量的程序 


function data = read_mat(path)
%   READ_MAT    读取所有文件
%   DATA = READ_MAT(PATH)读取路径PATH下的所有mat文件中的数据赋给data
%   前提是每个MAT文件只含有一个变量,如果含有多个,则使用READ_MAT
%   输出cell格式以免各mat中数据长度不同
%   输出data后,如要使用请用格式data{index}访问各数据项
%
%   原始版本:V1.0   作者:李鹏   时间:2009.04.04
%   修改版本:V1.1   修改内容:适应mat文件只有一个变量的情况   时间:2009.04.05
%
A = dir(fullfile(path,'*.mat'));
% 读取后A的格式为      
%                   name  -- filename
%                   date  -- modification date
%                   bytes -- number of bytes allocated to the file
%                   isdir -- 1 if name is a directory and 0 if not
A = struct2cell(A);
num = size(A);
for k =0:num(2)-1
    x(k+1) = A(4*k+1);% 找出name序列,x存储内容为*.mat
end
for k = 1:num(2)
    newpath = strcat(path,'\',x(k));
    temp = load(char(newpath));
    matname = char(fieldnames(temp));% 获取结构成员名称
    data{k} = getfield(temp,matname);% 获取该名称下的成员内容
end
% [EOF] read_mat.m


下面用这个文件做一个小的实验:

假如我有两个mat文件在路径E:\shuju下,则输入:
data = read_mat('E:\shuju');
检验结果可以看出是正确的,但是我想下面用debug来显示一下其中变量的变化情况,自己感觉是比较复杂的,因为从结构体,cell等数据变来变去的,可能我的程序把原来简单的问题复杂化了,但是的确没有找到更好的办法。



命令窗口输入:
>> dbstop in read_mat at 19
>> dbstop in read_mat at 26
>> dbstop in read_mat at 27
>> dbstop in read_mat at 28
然后运行
data = read_mat('E:\shuju');
我们发现程序在第19行(num = size(A);)停下了,在命令行输入A
显示
A = 
'a.mat'
'b.mat'

[1x20 char]
[1x20 char]

[175]
[176]
[0]
[0]
这就是这个路径下所有的mat文件的情况。
然后命令行输入:
K>> dbcont
注意K>>是调试程序时窗口显示的符号,就像正常时显示>>一样
在第26行停止
命令行输入:
K>> newpath
结果
newpath = 
'E:\shuju\a.mat'
这就是我们得到的第一个文件的全部路径
命令行输入:
K>> dbcont
27行停止,
命令行输入:
K>> temp
结果
temp = 
a: [1 2 3 4 5]
这是一个结构体变量,我们要将里面的field名称和内容提取出来,就是下面两行程序的意思了。
命令行输入:
K>> dbcont
28行停止,输入
K>> matname
结果
matname =
a
这就是这个变量的名字了,然后就很容易找到变量的内容最后赋值给data单元数据。
输入:
K>> dbcont
在下一个循环中的26行停止了
输入
K>> data{1}
结果
ans =
1
2
3
4
5
已经将第一个变量完全读取出来!
可以终止调试了
输入
K>> dbquit
终止,注意要将所有断点清楚呀。
输入
>> dbclear in read_mat
断点消失了。完成!
1.所有mat文件有多个变量的程序 


function data = readall_mat(path)
%   READALL_MAT    读取所有文件
%   DATA = READALL_MAT(PATH)读取路径PATH下的所有mat文件中的数据赋给data
%   mat文件中含有多个数据项
%   输出cell格式以免各数据项长度不同
%   输出data后若要使用data中的内容请使用data{index}访问
%
%   原始版本:V1.0   作者:李鹏   时间:2009.04.04
A = dir(fullfile(path,'*.mat'));
% 读取后A的格式为      
%                   name  -- filename
%                   date  -- modification date
%                   bytes -- number of bytes allocated to the file
%                   isdir -- 1 if name is a directory and 0 if not
A = struct2cell(A);
num = size(A);
for k =0:num(2)-1
    x(k+1) = A(4*k+1);
end
m = 1;
for k = 1:num(2)
    newpath = strcat(path,'\',x(k));
    temp = load(char(newpath));
    temp = struct2cell(temp);
    num2 = size(temp);
    for l = 1:num2(1)
        data{m} = temp{l};
        m = m+1;
    end
end
% [EOF] readall_mat.m




 中国电子技术论坛-函数加数据加验证程序.rar (24.82 KB, 下载次数: 19) 

 中国电子技术论坛-数据和验证程序.rar (14.83 KB, 下载次数: 13) 
 中国电子技术论坛-work.rar (10.76 KB, 下载次数: 9) 

3.jpg (19.94 KB, 下载次数: 1)

matlab进阶

matlab进阶
转自http://bbs.elecfans.com/jishu_214389_1_1.html
0 0
原创粉丝点击