如何读取数据程序进行优化?
1、预先为变量分配内存;
(1)原始程序如下:
程序通过fgetl()逐行读取数据,并对数据进行处理,代码如下:
profile on
filename = 'nav_data20180129000742-3.5Hr.txt';
%单位换算
d2r=pi/180;
temp=d2r/3600;
t=[];
freq=100;
j=0;
fid=fopen(filename);
while 1
j=j+1;
tline = fgetl(fid);
if tline==-1, break, end
nav_data=str2num(tline);
%累计时间
t=[t;j*1/freq];
%xyz三轴陀螺仪rad/s
wb(j,1) = nav_data(1,6)*temp;
wb(j,2) = nav_data(1,7)*temp;
wb(j,3) = nav_data(1,8)*temp;
%xyz三轴陀螺仪温度
gyro_tem(j,1)= nav_data(1,9);
gyro_tem(j,2)= nav_data(1,10);
gyro_tem(j,3)= nav_data(1,11);
%xyz三轴加速度计 m/s^2
fb(j,1) = nav_data(1,12);
fb(j,2) = nav_data(1,13);
fb(j,3) = nav_data(1,14);
%xyz三轴加速度计温度
acc_tem(j,1)= nav_data(1,15);
acc_tem(j,2)= nav_data(1,16);
acc_tem(j,3)= nav_data(1,17);
end
fclose(fid);
%保存数据
FOG.t=t;
FOG.wb=wb;
FOG.fb=fb;
FOG.freq=freq;
FOG.gyro_tem=gyro_tem;
FOG.acc_tem=acc_tem;
save( 'FOG.mat','FOG')
profile viewer
实际运行时间为:
(2)修改后程序如下:
clc; %清空命令行窗口
clear; %清空工作区
close all;
%% read data
profile on
filename = 'nav_data20180129000742-3.5Hr.txt';
%单位换算
d2r=pi/180;
temp=d2r/3600;
freq=100;
ts=1/freq;
j=0;
fid=fopen(filename);
%对变量预先分配内容
len=5*100*3600; %采样率100HZ,按照5小时预先分配
t=zeros(len,1);
wb=zeros(len,3);
gyro_tem=zeros(len,3);
fb=zeros(len,3);
acc_tem=zeros(len,3);
while 1
j=j+1;
tline = fgetl(fid);
if tline==-1, break, end
nav_data=str2num(tline);
%累计时间
% t=[t;j*1/freq];
t(j,1)=j*ts;
%xyz三轴陀螺仪rad/s
wb(j,1) = nav_data(1,6)*temp;
wb(j,2) = nav_data(1,7)*temp;
wb(j,3) = nav_data(1,8)*temp;
%xyz三轴陀螺仪温度
gyro_tem(j,1)= nav_data(1,9);
gyro_tem(j,2)= nav_data(1,10);
gyro_tem(j,3)= nav_data(1,11);
%xyz三轴加速度计 m/s^2
fb(j,1) = nav_data(1,12);
fb(j,2) = nav_data(1,13);
fb(j,3) = nav_data(1,14);
%xyz三轴加速度计温度
acc_tem(j,1)= nav_data(1,15);
acc_tem(j,2)= nav_data(1,16);
acc_tem(j,3)= nav_data(1,17);
end
fclose(fid);
%% 根据数据实际长度,进行裁剪
t(j:end,:)=[];
wb(j:end,:)=[];
gyro_tem(j:end,:)=[];
fb(j:end,:)=[];
acc_tem(j:end,:)=[];
%保存数据
FOG.t=t;
FOG.wb=wb;
FOG.fb=fb;
FOG.freq=freq;
FOG.gyro_tem=gyro_tem;
FOG.acc_tem=acc_tem;
save( 'FOG.mat','FOG')
profile viewer
程序运行时间: