【问题标题】:Matlab - Improving efficiency of file reading methodMatlab - 提高文件读取效率的方法
【发布时间】:2015-09-15 14:09:43
【问题描述】:

我正在编写一个 Matlab 脚本,该脚本首先将一个空格分隔的 .log 文件读入一个元胞数组。文件中的列标题都是字符串,但整个文件中的数据类型是混合的,所以为了简单起见,我现在一直将每个值都视为一个字符串。

这是我目前所拥有的,它适用于小文件。

fileID = fopen('file');
ImportData = char.empty; % create empty array to add on to

while ~feof(fileID)
    tLines = fgetl(fileID); % reads line into string
    raw = strsplit(tLines, ' '); %splits line into array for that line
    ImportData = cat(1, ImportData, raw); %adds line to rest of array
end

fclose(fileID);

但是,此脚本需要读取的实际文件非常笨重(30,000+ 行,200+ 列),我发现此过程非常缓慢。我做了一些研究,我确信矢量化是答案,但我对这个领域非常陌生。

我可以通过哪些方式更改此程序以显着提高速度?

编辑:列类型不一致,因此importdata 函数不起作用。该文件具有 .log 扩展名,因此 readtable 函数不起作用。理想情况下,使用 textscan 的更快方法是完美的。

【问题讨论】:

  • 列数是固定的吗?
  • 如果每一行的列数(当然还有每列的类型)都相同,您可以使用任何内置文件阅读器功能的 matlabs。例如importdataxlsread 或任何工作函数。您也可以使用第一行作为模板并设计一个fscanf。此外,可以使用textscan 方法,在其中指定分隔符。不知道数据格式很难给出建议
  • @CarlWitthoft 我认为ImportData 是一个变量。提供的代码似乎是 c 代码。建议宁愿使用 Matlab 的扩展库。
  • @patrik 'ImportData' 在这里是一个变量。整个文件中的数据类型不一致 - 有些列是字符串,有些是数字。这就是为什么据我所知“importdata”功能不起作用的原因。 'textscan' 是我一直在使用的,但我的问题是它对大文件效率低下。

标签: performance matlab import io vectorization


【解决方案1】:
readtable(filename,'FileType','text','Delimiter',' ')

应该可以正常工作。只要您的文件用“ ”分隔,文件扩展名“.log”就无关紧要。 如果您事先了解列格式,则可以进一步指定格式字符串/序列。指定格式字符串可以使操作更快。如果您不指定格式,则如果整列是数字,则返回数字;如果混合,则返回单元格字符串。

【讨论】:

  • 谢谢!这正是我想要的。
  • 很高兴我能帮上忙。请为我的答案投票好吗?
猜你喜欢
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
相关资源
最近更新 更多