Matlab - 从文件中读取数据,同时忽略nan线

时间:2014-09-04 11:16:41

标签: c matlab nan scanf

我有一个文件,其中数据存储在列中,上面有标题,中间有标记点。它是用跟踪器记录的运动数据的日志,并且例如每当有人在键盘上击中“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()调用行中的元素数量不匹配。 谢谢!

2 个答案:

答案 0 :(得分:0)

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定义为虚数,因此利用它们来增加可能会产生意想不到的后果。

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

答案 1 :(得分:0)

我认为使用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有很多选项,所以我确信它可以根据您的要求量身定制。