Matlab读取txt数据的实用方法[通俗易懂]

Matlab读取txt数据的实用方法[通俗易懂]需求有个朋友需要我帮忙写个matlab脚本读取100个txt文档的实验数据,这些文档的结构相同,分为四列,从第一列到第四列依次是时间、位置、速度、加速度。读取完数据之后需要对数据进行处理,具体的处理方式是:提取以0.002为采样周期的数据,分类存储起来。文件内容是这样的:技术难点技术难点在于,这些文件中的数据是从一个软件中仿真得到的,由于采用的是变步长仿真,因此采样时间不统一,很难采用对…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

需求

有个朋友需要我帮忙写个matlab脚本读取100个txt文档的实验数据,这些文档的结构相同,分为四列,从第一列到第四列依次是时间、位置、速度、加速度。读取完数据之后需要对数据进行处理,具体的处理方式是:提取以0.002为采样周期的数据,分类存储起来。
文件内容是这样的:
在这里插入图片描述

技术难点

技术难点在于,这些文件中的数据是从一个软件中仿真得到的,由于采用的是变步长仿真,因此采样时间不统一,很难采用对时间取余的操作来实现。

解决办法

首先对于给定的文档结构,采用textread函数读取四列数据分别存放在四个变量a1,a2,a3,a4中。小伙伴儿可能会问,由于文件头的存在,读取的数据前面几行并不是实际数据,怎么办?好办,把前几行去掉不就行了,使用MATLAB很容易提取。

[a1,a2,a3,a4]=textread(filename,'%s%s%s%s','headerlines',4);

由于读入到matlab中的数据属于文本变量,对应的类型是cell,而我们需要的数据类型是double,怎么办?类型转换吧;处理过程:cell->mat->double

function res=cell2double(input)
[n,m]=size(input);
res=zeros(n,1);
for i=1:n
   temp=cell2mat(input(i));
   res(i)=str2double(temp);
end
end

重点来了,由于采样时间不是固定的(变步长采样时间有些地方大,有些地方小),因此采用

mod(time(i),0.002)==0

这样的简单判断是不行的,本人试过这种方式来提取数据,结果有的文件提取的数据多,有的文件提取的数据少,无法跟时间进行对齐,确实很让人头疼。
考虑到采样时间精度在0.002秒以下,如果只是采用时间除以0.002取余数,很多数据会被错误判定为不合适,从而丢失数据。怎么办呢?
对时间四舍五入嘛,将时间四舍五入到小数点后3位不就行了。
但是呢,问题又来了,比如采样时间0.0082,0.0084时,则这两个数据都会被加入,这是行不通的,处理的结果依然跟前面的一样。
从四舍五入后的数据中寻找特征吧。对于四舍五入后的时间点,当存在相同的采样时间是只取其中的一个即可,仔细观察可以发现这样的数据特征,每一个满足要求的数据,它的后面一个数据的时间节点总是比它大。
代码就这样写吧:

  for j=1:time_rows-5-1
          if mod(time(j),0.002)==0%能被0.002整除,条件1
              if time(j+1)>time(j)%后一个采样时间比前一个大,条件2
                   tempTime(k)=time(j);
                   tempPos(k)=pos(j);
                   tempSpeed(k)=speed(j);
                   tempAcc(k)=acc(j);
                   k=k+1;
              end
          end
      end

好啦,贴一下完整的代码,仅供参考。

参考代码

clc;
clear all;
N=100;
M=5000;
dataToGetPos=zeros(M,N+1);
dataToGetSpeed=zeros(M,N+1);
dataToGetAcc=zeros(M,N+1);
for i=1:N
    str1='result';
    str2='.txt';
    filename=sprintf('%s%d%s',str1,i,str2);
   [a1,a2,a3,a4]=textread(filename,'%s%s%s%s','headerlines',4);
   [pos_rows,pos_cols]=size(a2);
   [time_rows,time_cols]=size(a1);
   [speed_rows,speed_cols]=size(a3);
   [acc_rows,acc_cols]=size(a4);
   tempPos=zeros(M,1);
   tempTime=zeros(M,1);
   tempSpeed=zeros(M,1);
   tempAcc=zeros(M,1);
   time=cell2double(a1(5:time_rows));
   pos=cell2double(a2(5:pos_rows));
   speed=cell2double(a3(5:speed_rows));
   acc=cell2double(a4(5:acc_rows));
   time=round(time,3);
   k=1;
   if i==1 
      for j=1:time_rows-5-1
          if mod(time(j),0.002)==0
              if time(j+1)>time(j)
                   tempTime(k)=time(j);
                   tempPos(k)=pos(j);
                   tempSpeed(k)=speed(j);
                   tempAcc(k)=acc(j);
                   k=k+1;
              end
          end
      end
      [tempPosRows,tempPoscols]=size(tempPos);
       if tempPosRows<M
          for l=tempPosRows+1:M
             tempPos(l)=0;
             tempTime(l)=0;
             tempSpeed(l)=0;
             tempAcc(l)=0;
          end
      end
      dataToGetPos(:,1)=tempTime;
      dataToGetPos(:,2)=tempPos;
      dataToGetSpeed(:,1)=tempTime;
      dataToGetSpeed(:,2)=tempSpeed;
      dataToGetAcc(:,1)=tempTime;
      dataToGetAcc(:,2)=tempAcc;
   else
      for j=1:time_rows-5-1
         if mod(time(j),0.002)==0
              if time(j+1)>time(j)
                tempPos(k)=pos(j);
                tempTime(k)=time(j);
                tempSpeed(k)=speed(j);
                tempAcc(k)=acc(j);
                k=k+1;
              end
          end
      end
      [tempPosRows,tempPoscols]=size(tempPos);
      if tempPosRows<M
          for l=tempPosRows+1:M
             tempPos(l)=0;
             tempSpeed(l)=0;
             tempAcc(l)=0;
          end
      end
      dataToGetPos(:,i+1)=tempPos;
      dataToGetSpeed(:,i+1)=tempSpeed;
      dataToGetAcc(:,i+1)=tempAcc;
   end
   disp(['Processing: ',num2str(i/N*100),'%.......']);
end
save dataToGetPos.mat dataToGetPos;
save dataToGetSpeed.mat dataToGetSpeed;
save dataToGetAcc.mat dataToGetAcc;
figure(1)
plot(dataToGetPos(:,1),dataToGetPos(:,2:101));
xlabel('时间/s');
ylabel('位置/mm');
set(gca,'FontSize',13);

figure(2)
plot(dataToGetSpeed(:,1),dataToGetSpeed(:,2:101))
xlabel('时间/s');
ylabel('速度/mm.s^{-1}');
set(gca,'FontSize',13);

figure(3)
plot(dataToGetAcc(:,1),dataToGetAcc(:,2:101))
xlabel('时间/s');
ylabel('加速度/mm.s^{-2}');
set(gca,'FontSize',13);
disp('Done!');

数据转换函数:

function res=cell2double(input)
[n,m]=size(input);
res=zeros(n,1);
for i=1:n
   temp=cell2mat(input(i));
   res(i)=str2double(temp);
end
end

运行以上代码生成下面的几幅图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196688.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python3列表_python tuple

    Python3列表_python tuple列表列表特点:是一种序列结构,与元组不同,列表具有可变性,可以追加、插入、删除、替换列表中的元素新增元素appendappend添加一个对象,可以是任意类型a=['zhangsa

    2022年7月31日
    3
  • matlab 查看函数,如何查看MATLAB函数的源代码 | 学步园「建议收藏」

    matlab 查看函数,如何查看MATLAB函数的源代码 | 学步园「建议收藏」如何查看MATLAB函数的源代码大家都知道MATLAB是开源的,所有的函数源代码都是可以查看的。但是,对于初学者来说,可能还不知道如何查看MATLAB函数的源代码。函数之  type假设需要查看function_name的源代码,在命令窗口中键入 type  function_name即:>>typeimreadfunction[X,map,alpha]=imread(v…

    2022年9月13日
    0
  • vim/ideavim命令[通俗易懂]

    vim/ideavim命令[通俗易懂]IdeaVim插件使用技巧在IDEAIntellij小技巧和插件一文中简单介绍了一下IdeaVim插件。在这里详细总结一下这个插件在日常编程中的一些常用小技巧。供有兴趣使用这个插件,但对Vim还不十分熟悉的朋友参考。当然基本的hjkl移动光标和几种常见模式等等基本概念就略过不提了。为了确保只包含常用操作,这里提到的技巧都没有从现成文档里抄,而是凭记忆列出(不常用自然就不记得了)。估计会有所遗漏,慢慢再补充。1.切换Vim模拟器状态这个插件允许设置一个快捷键一键开启或关闭,在切换模式时会同时自

    2022年10月1日
    0
  • LaTeX详细安装步骤和简明教程

    LaTeX详细安装步骤和简明教程第一步:环境配置配置TeXLive和TeXstudio。TeXLive是编译器为Latex提供运行所需的环境;TeXstudio编辑器,提供操作界面,需要先安装好TeXLive之后,TeXstudio才能使用。TeXLive下载:TeXLive下载地址:(清华镜像)https://mirrors.tuna.tsinghua.edu.cn/ctan/systems/texlive/Images/下载“.iso”文件–>“texlive2020.iso3.7GiB…

    2022年5月18日
    55
  • 易经六十四卦详解白话文解释——易经64卦全解(下)「建议收藏」

    易经六十四卦详解白话文解释——易经64卦全解(下)「建议收藏」文章目录第33卦 天山遁(遁卦) 遁世救世 下下卦第34卦 雷天大壮(大壮卦) 壮勿妄动 中上卦第35卦 火地晋(晋卦) 求进发展 中上卦第36卦 地火明夷(明夷卦) 晦而转明 中下卦第37卦 风火家人(家人卦) 诚威治业 下下卦第38卦 火泽睽(睽卦) 异中求同 下下卦第39卦 水山蹇(蹇卦) 险阻在前 下下卦第40卦 雷水解(解卦) 柔道致治 中上卦第41卦 山泽损(损卦) 损益制衡 下下卦第…

    2022年8月18日
    4
  • JSTL+EL表达式方法获取Oracle的Clob字段内容[通俗易懂]

    JSTL+EL表达式方法获取Oracle的Clob字段内容

    2022年3月11日
    118

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号