我有一个关于 MATLAB 的问题textscan
。我有一个包含大量列的文件,并且行数为 1-32 行(与 #col 相比非常小)。这是一个简单的例子:
Test1 1 2 3 4 5
Test2 6 7 8 9 10
列数是不知道的,第一个也是唯一一个开始一行的字符串的长度是不知道的。我在第一行读取并计算列数,并构建实际的格式字符串以读取文件的其余部分,如下所示:
function output = parseFile(filename)
%% Calculate Number of Samples
% Reads in first line
tic
fid = fopen(filename);
line = fgetl(fid);
fclose(fid);
firstLine = textscan(line, '%s', 'CollectOutput', true);
numSamples = size(firstLine{1},1) - 1;
toc
%% Parse File
tic
fid = fopen(filename);
format = ['%s ' repmat('%f', [1 numSamples]) '%*[^\n\r]'];
fileData = textscan(fid, format, 'CollectOutput', true);
fclose(fid);
toc
%% Format Output
output.names = cell2mat(fileData{1});
output.values = fileData{2};
end % end function
我选择了几个例子,每次我得到以下信息:假设我有一个包含 100,000 列和 3 行的文件。/ s 告诉我第一行读取在 0.16 秒内完成tic
。toc
然后,当我构建格式字符串并阅读整个文档时,它会在 9 秒内完成。为什么读入时第一行%s
读入如此之快,但下一次我读取整个文件(仅多 2 行)时却需要更长的时间?是因为format
我第二次解析文件时使用了更复杂的字符串吗?将整个文件解析为空格分隔的字符串然后执行后处理(例如:)str2double
以获取我的双精度矩阵是否有意义?
编辑:澄清文件格式的细节:
(string of unknown length)(1 space)(-123.001)(1 space)(41.341)(1 space)...
...
所以数字不是 int
,它们是正/负。
注意:我基本上感到困惑的是,为什么 textscan 能够非常快速地读取文件的第一行,而接下来的两行比第一行花费的时间要长得多。