我有一个文件,其中数据存储在列中,上面有标题,中间有标记点。它是用跟踪器记录的运动数据的日志,并且例如每当有人在键盘上击中“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()调用行中的元素数量不匹配。 谢谢!
答案 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将i
和j
定义为虚数,因此利用它们来增加可能会产生意想不到的后果。
编辑:你也没有考虑你的标题行。合并一些方法来跳过一定数量的行,这样你就不会试图将非数据解析到数据数组中。
答案 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
有很多选项,所以我确信它可以根据您的要求量身定制。