【问题标题】:Matlab - read data from file while ignoring nan linesMatlab - 从文件中读取数据,同时忽略 nan 行
【发布时间】:2014-09-04 20:27:18
【问题描述】:

我有一个文件,其中数据存储在列中,上面有一个标题,中间有一个标记点​​。它是使用跟踪器记录的运动数据日志,并且例如每次有人在键盘上按“M”时设置标记。 我的问题是,如果我尝试读取的行是所需的格式,我如何在每次检查时读取数据?我非常了解 C,但在使用 Matlab 以及函数在那里的工作方式方面存在问题。 到目前为止,我的方法是:

fId = fopen('Coordinates.txt', 'r');
i = 0;
A=zeros(10000, 17);
tline = fgetl(fId);
while ischar(tline)
    i = i+1;
    if isnan(tline)
    else
        A(i) = sscanf(tline, '%f %f %f %f %f %f %d %c %d %d %d %f %f %f %f %f %f', 17);
    end
% handX(i) = A(i,1);    
tline = fgetl(fId);    
end
fclose(fId);

如果你知道我打算用这个去哪里? (开头)我的文件是这样的:

ID is 0001; Number of Trial is 012;
Time is Tue Sep 02 15:35:32 2014
V=Virtual

X [in]      Y [in]      Z [in]      ROLL [rad]  YAW [rad]   PITCH [rad] TIME [ms]   Avatar Style    Incongruence    VHI RLP VX [in]     VY [in]     VZ [in]     VYaw [rad]  VPitch [rad]    VRoll [rad]

2.548209    0.083796    -3.264887   -0.580893   -1.505823   0.147869    1935        h       0       0   0   -4.951791   -1.916204   -3.264887   -0.580893   -1.505823   0.147869
2.550583    0.083348    -3.269413   -0.579991   -1.506423   0.147635    2075        h       0       0   0   -4.949417   -1.916652   -3.269413   -0.579991   -1.506423   0.147635

所以我想做的是查看文件中的每一行,检查它是否以数字开头,跳过 nan() 行,并且最好在遇到 nan() 行时做一个标记)。另外,我想将值保存在单独的向量中(如 handX)。到目前为止,我只收到与 sscanf() 调用的行中的元素数量不匹配的错误。 谢谢!

【问题讨论】:

  • 作为一般评论,最好明确提供错误和堆栈跟踪,而不仅仅是摘要。

标签: c matlab nan scanf


【解决方案1】:

我认为使用 Matlab 而不是 C 的主要区别之一是您通常不需要在循环中执行操作,并且在 Matlab 中避免循环通常更快。

您可以使用textscan 轻松读取您的数据:

fId = fopen('Coordinates.txt', 'r');
A = textscan(fId, '%f %f %f %f %f %f %d %c %d %d %d %f %f %f %f %f %f', 'HeaderLines', 6);
fclose(fId);

读取您的示例文件会产生 A 作为 1x17 元胞数组。每个单元格都包含一列数据(在本例中为 2x1 矩阵)。

textscan 有很多选择,所以我相信它可以满足您的要求。

【讨论】:

    【解决方案2】:

    来自sscanf 的错误只是indexing 问题。如所写,您正在尝试将 1x17 数组写入 1x1 数组。

    立即修复是:

    A(i,:) = sscanf(tline, '%f %f %f %f %f %f %d %c %d %d %d %f %f %f %f %f %f', 17);
    

    sccanf 需要注意的一点是,它将字符转换为其数字等价物(每个字符都有自己的列,对于大于 1 的字符串长度要注意),因此您的示例中的 'h' 字符串已转换为104。如有必要,您可以使用 char 将其转换回字符串或使用不同的函数来解析该行。例如,textscan 输出一个元胞数组,因此您可以拥有混合数据类型。

    一般来说,MATLAB 将ij 定义为虚数,因此使用它们来增加可能会产生意想不到的后果。

    编辑:您也没有考虑标题行。结合一些方法来跳过一定数量的行,这样您就不会尝试将非数据解析到数据数组中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 2014-02-23
      • 2011-09-24
      • 1970-01-01
      • 2021-04-17
      • 2016-04-19
      • 1970-01-01
      相关资源
      最近更新 更多