【问题标题】:Read every other line of data in MATLAB读取 MATLAB 中的每一行数据
【发布时间】:2016-06-23 03:37:52
【问题描述】:

有大量关于将数据读入 MATLAB 的各种方法的帖子,但似乎都没有解决这个特殊问题。如何在没有循环的情况下只读取每隔一行?

我的数据格式如下:

1 2 3 4 5 6 7 8 9 string
1 2 -1 5 3 -1 ...
1 2 3 4 5 6 7 8 9 string
1 2 -1 5 3 -1 4 9 -1 ...
...

换句话说,数据交替行。我似乎无法弄清楚只抓取奇数行的数字部分。

我知道我可以使用fscanf 作为fscanf(fid, '%f %f %f %f %f %f %f %f %f %*s') 来实际阅读相关行。但是,这在不遵循相同格式的偶数行上会分崩离析。

我还尝试了fscanf(fid, '%f %f %f %f %f %f %f %f %f %*s\n%*[\n]'),认为这可能匹配 2 行(由于包含返回字符),同时由于星号和正则表达式组合而跳过偶数行上的数据。然而,这并没有奏效。重要的是要注意偶数行的长度不同,所以我不能只对它们进行特定的模式匹配。

我该怎么做?

【问题讨论】:

  • 您有什么特别的原因不想使用循环吗?这样做真的很容易:stackoverflow.com/questions/5531082/…
  • 涉及预处理文件的第二种解决方案在这里:stackoverflow.com/questions/9894986/…
  • @gariepy:我不想使用循环,因为通常我要处理大量文件。另外,如果可以避免的话,我不想再解析每一行。
  • 另外,我在 Windows 上,我不想编辑文件。只需读取数据
  • 所以,建议......如果您真的只是想要大文件的速度,请不要强加诸如“无循环”之类的任意约束。循环并不邪恶。有时最好的答案是循环。 MATLAB 并没有真正用于这类事情的内置实用程序。

标签: matlab file-io


【解决方案1】:

一个可行的解决方案:(虽然我没有做任何运行时间测试)

我创建了一个文本文件FileRead,其中包含您指定的 4 行。

% Open file
fid=fopen('FileRead.txt');

% Read the whole lines of your files in a cell array
A=textscan(fid,'%s','Delimiter','\n');

% Close file
fclose(fid);

% Extract the even lines
Tmp=A{1,1};
out1=Tmp(2:2:end);

% Use cellfun to apply str2num to every cell in out1
out=cellfun(@str2num,out1,'UniformOutput',false);

输出:

【讨论】:

  • 这是一个很好的解决方案。我一直在试图回忆允许这样做的 MATLAB 文件阅读器和格式字符串的确切排列。对于多达 1 亿行左右的文件,这将非常有效。
猜你喜欢
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
  • 2014-02-06
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
相关资源
最近更新 更多