matlab打开dat形式⽂件_matlab读取dat⽂件matlab 读取dat⽂件
关注:145 答案:2 mip版
解决时间 2021-01-17 21:36
提问者壹玍徴戰何亽陪
2021-01-17 14:35
想⽤matlab 语句读取桌⾯上的dat⽂件,再把他转化为矩阵。⽐如⽤fscanf ,请问怎么做呢
最佳答案
⼆级知识专家嘴硬⽋吻
2021-01-17 14:48
命令 dlmread 看help 特适合于ASCII字符类型的以空格分开的矩阵dat⽂件的读⼊ 注意 参数filename 路径问题
全部回答
1楼千⾥故⼈稀
2021-01-17 15:34
这是我之前处理⼼电数据时的程序。
⼼电数据是dat,不知道符不符合你的咯。
%-------------------------------------------------------------------------
% 程序fun_readecgdata ⽤于读取ecg信号数据,将原始的⼆值数据转换为⼗进制数
% 输⼊参数及其⽰例:
% path= 'd:/matlab/r2007b/work/ecg data'; % 指定数据的储存路径
% headerfile= '117.hea'; % .hea 格式,头⽂件,可⽤记事本打开。这个其实只是记录你的dat数据的⼀些信息的
% datafile='117.dat'; % .dat 格式,ecg 数据
% samples2read=2048; % 指定需要读⼊的样本数
% % 若.dat⽂件中存储有两个通道的信号:
% % 则读⼊ 2*samples2read 个数据
python怎么读取dat文件% 输出参数:m —— ⼀个samples2read⾏2列的数据矩阵,每列数据代表⼀个通道的信号值
%-------------------------------------------------------------------------
function m = fun_readecgdata(path,headerfile,datafile,samples2read)
%------ load header data --------------------------------------------------
%------ 读⼊头⽂件数据 -----------------------------------------------------
%
% ⽰例:⽤记事本打开的117.hea ⽂件的数据
%
% 117 2 360 650000
% 117.dat 212 200 11 1024 839 31170 0 mlii
% 117.dat 212 200 11 1024 930 28083 0 v2
% # 69 m 950 654 x2
% # none
%
%-------------------------------------------------------------------------
%-------------------------------------------------------------------------
% 【注】函数 fprintf 的功能将格式化的数据写⼊到指定⽂件中。
% 表达式:count = fprintf(fid,format,a,...)
% 在字符串'format'的控制下,将矩阵a的实数数据进⾏格式化,并写⼊到⽂件对象fid中。该函数返回所写⼊数据的字节数 count。% fid 是通过函数 fopen 获得的整型⽂件标识符。fid=1,表⽰标准输出(即输出到屏幕显⽰);fid=2,表⽰标准偏差。
%-------------------------------------------------------------------------
fprintf(1,'//n$> working on %s .../n', headerfile); % 在matlab命令⾏窗⼝提⽰当前⼯作状态
signalh= fullfile(path, headerfile); % 通过函数 fullfile 获得头⽂件的完整路径
fid1=fopen(signalh,'r'); % 打开头⽂件,其标识符为 fid1 ,属性为'r'--“只读”
z= fgetl(fid1); % 读取头⽂件的第⼀⾏数据,字符串格式
a= sscanf(z, '%*s %d %d %d',[1,3]); % 按照格式 '%*s %d %d %d' 转换数据并存⼊矩阵 a 中
nosig= a(1); % 信号通道数⽬
sfreq=a(2); % 数据采样频率
clear a; % 清空矩阵 a ,准备获取下⼀⾏数据
for k=1:nosig % 读取每个通道信号的数据信息
z= fgetl(fid1);
a= sscanf(z, '%*s %d %d %d %d %d',[1,5]);
dformat(k)= a(1); % 信号格式; 这⾥只允许为 212 格式
gain(k)= a(2); % 每 mv 包含的整数个数
bitres(k)= a(3); % 采样精度(位分辨率)
zerovalue(k)= a(4); % ecg 信号零点相应的整数值
firstvalue(k)= a(5); % 信号的第⼀个整数值 (⽤于偏差测试)
end;
fclose(fid1);
clear a;
%------ load binary data --------------------------------------------------
%------ 读取 ecg 信号⼆值数据 ----------------------------------------------
%
% 说明:.dat ⽂件的数据格式
%
% ⽤ uint8 格式读⼊ n 个样本,存⼊矩阵 a 中,则 a 有 n ⾏、3列,每列⼀个字节,
% 即每⾏⽤三个字节表⽰两个数m1、m2,每个数 12 bits,故⼜称为 212 格式
% m1的低8位存放在 a(:,1),m2的低8位存放在a(:,3),
% m1的⾼4位存放在a(:,2)的低4位,m2的⾼4位存放在a(:,2)的⾼4位
%
% 根据上述数据格式,可以⽤⼀系列移位、位与操作,提取出⼗进制格式的双通道信号数据
%
%-------------------------------------------------------------------------
if dformat~= [212,212], error('this script does not apply binary formats different to 212.'); end;
signald= fullfile(path, datafile); % 读⼊ 212 格式的 ecg 信号数据
fid2=fopen(signald,'r');
a= fread(fid2, [3, samples2read], 'uint8')'; % 矩阵a共有samples2read⾏、3列,每列数据都是以uint8格式读⼊,注意这时数据通过uint8的读⼊⽅式已经成为⼗进制数了
fclose(fid2);
m2h= bitshift(a(:,2), -4); % 字节向右移四位,即取字节的⾼四位,属于信号2的⾼4位
m1h= bitand(a(:,2), 15); % 取字节的低四位,属于信号1的⾼4位
prl=bitshift(bitand(a(:,2),8),9); % sign-bit 取出字节低四位中最⾼位,向左移九位
prr=bitshift(bitand(a(:,2),128),5); % sign-bit 取出字节⾼四位中最⾼位,向左移五位
m( : , 1)= bitshift(m1h,8)+ a(:,1)-prl; % 将m1h、m2h分别左移8位,即乘以2^8,再分别加上a(:,1),a(:,2),
m( : , 2)= bitshift(m2h,8)+ a(:,3)-prr; % 由于左移时把符号位也移动了,要减去符号位的值
m=m'; % 为了⽅便后期的数据处理,将输出矩阵 m 转置为2⾏samples2read列
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%下⾯是调⽤啦。。。
%%%%%%%%%%%%%%%%%%%%%%
clear.clc.
path='e:\xiangmu\mit-bin';
a=[];
for i=100:131
headerfile= strcat(num2str(i),'.hea'); % .hea 格式,头⽂件,可⽤记事本打开
datafile=strcat(num2str(i),'.dat'); % .dat 格式,ecg 数据
samples2read=2048; % 指定需要读⼊的样本数
a(i-99,:)=fun_readecgdata(path,headerfile,datafile,samples2read);
end
save a
我要举报
如果感觉以上信息为低俗/不良/侵权的信息,可以点下⾯链接进⾏举报,我们会做出相应处理,感谢你的⽀持!点此我要举报以上信息!
推荐资讯
⼤家都在看
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论