matlab数据整合

matlab数据整合

  • 一、读取数据
    • 1、load/importdata/csvread
    • 2、dlmread
    • 3、fscanf(底层函数)
  • 二、保存数据
  • 三、最终代码

内容来源众多,故不一一挂出,本文章仅仅为自己记录学习内容,如果相关内容涉及他人原创,需要删除或者挂原文链接的联系我。

一、读取数据

matlab 文本文件的读写可以分为两类,一类是高级函数,一类是底层函数。

高级函数运用起来简单,但是定制性差。底层函数用法复杂,灵活性高

1、load/importdata/csvread

对于简单文本读取(文本内容只包括数值,并且以逗号或者空格为分隔符),三个函数用法基本一致。

load、importdata常见用法:

datapath=[datapath,filename]
m=load(datapath)
m=importdata(datapath)

csvread读取csv:

m=csvread('filename',row,col,range)
M=csvread(filename,R1,C1,[R1 C1 R2 C2])  % 仅读取行偏移量 R1 和 R2 及列偏移

读取文件,除了文件名,还指定了开始读取位置的行号(row)和列号(col)。这里行号和列号以0开始计数。也就是说row=0,col=0表示一行一列

range限定了读取范围,range = [R1 C1 R2 C2]。

例如,**偏移量R1=1,C1=0,R2=2,C2=2;**从文件中读取从第2行到第3行,第1列到第3列框定的元素组成一个新的矩阵,叫做M

**注意:**csv文件中的空项,读到矩阵中时,会初始化为0.

2、dlmread

dlmread的用法:能够指定分隔符(csvread只能读取逗号分隔符和空格分隔符)

m=dlmread(filename,delimiter)
M=dlmread(filename,"。")

delimiter 为分隔符;
如果行列数不一致的数据, dlmread 会自动在空白数据处补0

3、fscanf(底层函数)

fscanf的用法:按指定格式从文本文件中读取数据

例:文本文件 test.txt 包含以下数据:
1。2。3。1
5。1。1。8
9。7。6。2
4。1。5。1

fid = fopen('test.txt');              %通过fopen获取文件标识
formatSpec = '%d。%d。%d。%d';         %指定读取格式
A = fscanf(fid,formatSpec ,[4,4]);    %读取文件数据并存为4*4矩阵
fclose(fid);                          %调用fclose关闭文件
A = A.’                               %由于fscanf是列主序,因此读取完还需要进行转置


A=
  1 2 3 1
  5 1 1 8
  9 7 6 2
  4 1 5 1
fid = fopen('test.txt');
A = fscanf(fid,'%d。',[4,4])
fclose(fid);
A = A.'


A=
  1 2 3 1

原因:当文件指针读取完13时,formatSpec需要匹配的字符串为“。”,但是1后边的下一字符串为5,匹配失败,fscanf停止读取

复杂文本文件(把数字信息提取出来):

lambda: 7.580000e-05
lambdaB: 8.000000e-05
initial pulse width: 7.853636e-13
output pulse width: 6.253030e-13
dispersion length: 6.307732e-02
nonlinear length: 9.572495e-01

lambda: 7.590000e-05
lambdaB: 8.000000e-05
initial pulse width: 7.848788e-13
output pulse width: 5.778485e-13
dispersion length: 5.852858e-02
nonlinear length: 9.195277e-01

dataPath='F:\test.txt'
fid=fopen(dataPath);
c1='%*s %e';   % :"%"后面接一个"*"代表跳过这个数据,%*s即代表跳过第一个字符串’lambda:’,%e表示读取以科学计数
c2 = '%*s %e';
c3 = '%*s %*s %*s %e';
c4 = '%*s %*s %*s %e';
c5 = '%*s %*s %e';
c6 = '%*s %*s %e';
formatSpec=[c1,c2,c3,c4,c5,c6];  % 以6为1组,重复读取,直至读取完整个文件
A=fscanf(fid,formatSpec,[6,inf]) % "A"为变量名
fclose(fid);
% 保存
savepath='F:\xi\'
save(savepath,'A')

二、保存数据

%:1、保存指定的变量在 filename 指定的文件中。
save('filename', 'var1', 'var2', ...):
%:2、将工作区中的所有变量保存在当前工作区中的文件中,文件名为 matlab.mat
save
% 3、指定保存文件的格式,格式可以为MAT文件、ASCII文件等。
save('..., 'format')
savepath='F:\xi\';
filename = [savepath,'负载L0.txt']; %自己更改格式
save(filename,'Data_1','-ascii')

三、最终代码

%%============Arrange data ===========%%
% 1、清除
clear;    % 从工作区中删除项目,释放系统内存  
clc;      % 清理命令窗口
close all % 移除指定绘画
% 2、保存路径
savepath = 'D:\data\migreadte data\Data of elder brother MAO paper\experimental data\vibration signal\';
% %=====Label-1 Data----负载L0=====%%
% 3、数据来源路径
Datapath='D:\data\migreadte data\Data of elder brother MAO paper\vibration signal\L0\';
% 加载数据
a=load([Datapath,'BL_CamFro_Oil2600_S100_L000_ 18-12-12 13-01-04.mat']);
b=load([Datapath,'TB50_CamFro_S100_L000_ 18-12-17 17-33-45.mat']);
c=load([Datapath,'TB100_CamFro_S100_L000_ 18-12-17 21-28-37.mat']);
d=load([Datapath,'OS_CamFro_Oil1500_S100_L000_ 18-12-14 18-03-14.mat']);
e=load([Datapath,'OS_CamFro_Oil2000_S100_L000_ 18-12-14 13-18-47.mat']);
% 4、整理数据
% 把原始数据第四列,以每次L个长度放入新数组,最终生成大小为2048*100的数组
L=2048
for i=1:100
    
    Data1(:,i) = a.Data(L*(i-1)+1:L*i,4);
    Data2(:,i) = b.Data(L*(i-1)+1:L*i,4);
    Data3(:,i) = c.Data(L*(i-1)+1:L*i,4);
    Data4(:,i) = d.Data(L*(i-1)+1:L*i,4);
    Data5(:,i) = e.Data(L*(i-1)+1:L*i,4);
    
end
% 整合数组(按列拼接),生成大小为2048*500
Data_1 = [Data1,Data2,Data3,Data4,Data5];
% 5、保存文件
savepath1=[savepath,'负载L0.mat']
save(savepath1,'Data_1')

你可能感兴趣的:(杂集,matlab,开发语言,矩阵)