[已解决] 如何高效地剔除数据有问题的行?

[复制链接]
DDG055 发表于 2022-5-11 12:02:09
本帖最后由 DDG055 于 2022-5-12 11:51 编辑

有一个m*8矩阵,截取其中一部分数据如下:
原始问题数据.JPG
现在要剔除矩阵中不完整的行或者有问题的行。有问题的行的特征:
   1. 行元素个数少于8个;
   2. 第2列元素,第 i 行比第 i-1行数值小,则删除第 i 行;
如果行最后不以逗号结尾(也是写入数据不完整),但元素个数等于8个,则该行数据有效,保留;

编写的程序如下:

clc;close all;clear all;

filepath='.\';
Data=importdata('DT-1.txt');
[m,n]=size(Data);             % n=8
data1=Data(2:end-1,2:n);   
[m1,n1]=size(data1);          % n1=7

data_new=ones(m1,n1);         % m1*n1全1阵
new_count=1;
for i=1:m1
    x=length(data1(i,:));
    if x==7
        data_new(new_count,:)=data1(i,:);
        new_count=new_count+1;
        if new_count>m1
           new_count=m1
        end
        i=i+1;
    end
end
data=data_new(1:new_count,1:n1);

t=data(:,1);X=data(:,2);Y=data(:,3);Z=data(:,4);a=data(:,5);b=data(:,6);c=data(:,7);
figure(1);
plot(t,X,'m',t,Y,'b',t,Z,'g');
grid on;

figure(2);
plot1=plot(t,a,'m');
plot1.Color(4)=0.3;
hold on;
plot1=plot(t,b,'b');
plot1.Color(4)=0.3;
hold on;
plot1=plot(t,c,'g');
plot1.Color(4)=0.3;
grid on;


这个程序存在的问题就是只能绘制一部分数据图,并不能绘制全部数据,请大神帮忙看一下问题出在哪里?

另外一种去掉有问题的行的思路:
  data(i,:)=[];
这种会不会导致原始数据第二列顺序混乱?

附件:m文档 &  原始数据截取DT-1.zip
DataProcess.m (813 Bytes, 下载次数: 0)

最佳答案


谢中华 发表于 2022-5-12 16:19:17
发一个参考代码
  1. data = readmatrix('DT-1.txt');
  2. % data = importdata('DT-1.txt');
  3. data = data(:,1:8);
  4. x = data(:,2);
  5. id = diff([x(1);x]) < 0 | any(isnan(data),2);
  6. data(id,:) = [];
  7. t = data(:,1);X = data(:,2);Y = data(:,3);Z = data(:,4);
  8. a = data(:,5);b = data(:,6);c = data(:,7);

  9. figure(1);
  10. plot(t,X,'m')
  11. grid on

  12. figure(2)
  13. plot(t,Y,'b',t,Z,'g');
  14. grid on;

  15. figure(3);
  16. plot(t,a,'m');
  17. hold on;
  18. plot(t,b,'b');
  19. plot(t,c,'g');
  20. grid on;
复制代码

3 条回复


DDG055 发表于 2022-5-12 14:17:20
经试验,发现数据中段的原因是遇到了如下的数据:

a11, a12, a13, a14, a15, a16, a17, a18,
a21, a22, a23, a24, a25, a26, a27, a28,
a31, a32, a33, a34, a35, a36, a37, a38,
a41, a42, a43, a44, a45, a46, a47, -
a51, a52, a53, a54, a55, a56, a57, a58,

第四行的数据没写完,该数据是个负数,只有负数符号没有负数数据。

谢中华 发表于 2022-5-12 16:19:17
发一个参考代码
  1. data = readmatrix('DT-1.txt');
  2. % data = importdata('DT-1.txt');
  3. data = data(:,1:8);
  4. x = data(:,2);
  5. id = diff([x(1);x]) < 0 | any(isnan(data),2);
  6. data(id,:) = [];
  7. t = data(:,1);X = data(:,2);Y = data(:,3);Z = data(:,4);
  8. a = data(:,5);b = data(:,6);c = data(:,7);

  9. figure(1);
  10. plot(t,X,'m')
  11. grid on

  12. figure(2)
  13. plot(t,Y,'b',t,Z,'g');
  14. grid on;

  15. figure(3);
  16. plot(t,a,'m');
  17. hold on;
  18. plot(t,b,'b');
  19. plot(t,c,'g');
  20. grid on;
复制代码
回复此楼

DDG055 发表于 2022-5-12 17:11:45

大神的代码很高效简洁!
我用了feof函数才解决读到最后一行的问题。

fid = fopen(FileNameFull,'r');
n = 1;
while ~feof(fid)
   j = fgetl(fid);
   n = n+1;
end
fclose(fid);
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表