背景:
近期做实验需要处理大量的.dat格式数据,文件内容格式相同,生成折线图并保存图片。
思路:
1. 新建文件夹dat_in,存放待处理数据文件
2. 循环读取文件名,放入元胞数组
3. 按文件名循环处理数据,每个文件处理流程如下
3.1 根据数据标识去除无效数据
3.2 读取待处理数据,存入二维数组
3.3 数据运算,绘图
3.4 新建文件夹dat_image,以文件名变量命名另存图片,效果如下
代码实现:
close all
clear all
clc
%———另一种文件名加载到元胞数组方法———————————
% path = '.\dat_in\';%添加数据文件夹相对路径
% list = dir([path,'*.dat']); %读取path路径下所有dat格式文件
% filename = cell(length(list),1);%创建length(list)*1的元胞数组,即length(list)行,1列
% for ii = 1:length(list) %将path文件夹内的所有dat格式文件的文件名放入filename()
% filename(ii) = {list(ii).name};
% end
% FN = cell2mat(filename(8));
%—————————————————————————————
%———将数据文件名添加到元胞数组,对文件夹内所有.dat文件进行数据处理——
path = '.\dat_in\'; %添加数据文件夹相对路径,文件夹在.m文件夹中
list = dir([path,'*.dat']); %读取path路径下所有dat格式文件
fileNames={list.name}; %将数据文件名添加到元胞数组
for i = 1:length(fileNames) %加载数据,放入矩阵data_in数组
data_in = load(fileNames{i});
%———判断前k行属于无用数据———————————
reference = data_in(:, 7); %加载第7列数据,寻找标志位,记录标志位行数k
for k = 1:length(reference)
x(k) = reference(k);
if x(k) ~= 0
break;
end
end
k = k-2;
disp(k);
%————————数据处理——————————————————————
D = data_in(:, [2 3 5 4 7 8]); %将2 3 5 4 7 8列数据按顺序存入矩阵D
D(1:k,:) = []; %去除前k行无效数据
hmax = length(D);
m1R = D(:, 1); %电机1实际轨迹
m2R = D(:, 2); %电机2实际
j5R = D(:, 3); %关节5实际
j6R = D(:, 4); %关节6实际
m1P = D(:, 5); %电机1规划
m2P = D(:, 6); %电机2规划
j5P = (m1P + m2P)/2;
j5R1 = j5R(1);
j5P2 = (m1R + m2R)/2;
j5CE = j5P2 - j5R + j5R1;
j6P = (m2P - m1P)/2;
j6R1 = j6R(1);
j6P2 = (m2R - m1R)/2;
j6CE = j6P2 - j6R + j6R1;
%————————出图—————————————————
% figure1
set(gcf,'Position',[200 200 1080 720]); %gcf,返回Figure句柄值,[图表左下角横坐标,左下角纵坐标,宽,高],单位像素
set(gca,'Position',[0.08 0.08 0.84 0.85]); %图表占比,同上,相对比例
plot(j5CE,'g','linewidth',1); %打印曲线1,颜色green,线宽1
ax = gca; %坐标轴设置和原点重合
ax.XAxisLocation = 'origin';
ax.YAxisLocation = 'origin';
xlabel('时间(×0.004s)','fontname','微软雅黑','fontsize',14,'FontWeight','bold','Color','r'); %横轴标签,字号,字体,颜色
ylabel('误差(度)','fontname','微软雅黑','fontsize',14,'FontWeight','bold','Color','r');
% set(gca,'YTick',[-10:1:3]); %设置y轴[起值,间隔,终值],gca,返回axis对象的句柄值
%h = annotation('textarrow',[0.6 0.4],[0.2 0.185],'Color','r','headsize',5); %箭头,[x起 x终][y起 y终],headsize箭头大小
%set(h,'string','误差最大值-8°','fontsize',12); %箭头注释,颜色随箭头
title([fileNames{i} '关节误差曲线'],'fontsize',18,'fontweight','bold','fontname','微软雅黑','Color','r');
%text(j5CEmax,0,'\leftarrow 误差最小值');
% legend('j5CE','fontsize',10,'FontWeight','bold','Color',[0.9 0.9 0.9]); %颜色可以用rgb值,也可以用字母简写
hold on;
plot(j6CE,'r','linewidth',1); %曲打印曲线2
legend('j5CE','j6CE','fontsize',10,'FontWeight','bold','Color',[0.9 0.9 0.9]); %曲线标签,颜色可以用rgb值,也可以用字母
hold off;
pause(2); %图表保持显示2秒
%————————存图————————————————
mkdir dat_image; %新建dat_image文件夹,如存在会警告,不影响程序
filepath=pwd; %保存当前工作目录
cd('dat_image'); %把当前工作目录切换到指定文件夹
% saveas(gcf,[fileNames{i} '.png']); %存图方法一
f = getframe(gcf); %存图方法二
imwrite(f.cdata,[fileNames{i} '传动误差.png']); %将fileNames{i} 变量写入文件名
cd(filepath); %返回工作目录
end; %.dat文件处理for循环尾
close; %关闭所有图表
其他:
程序多次执行可能会造成.dat文件乱码(一般是第二个文件),原因未知。建议另存一份,如乱码替换后重新执行。