我编写了这段代码,它运行良好,但对于我的目的来说太慢了:
%%% load nodal data %%%
path = sprintf('%sfile.dat',directory);
fid = fopen(path);
num_nodes = textscan(fid,'%s %s %s %s %d',1,'delimiter', ' ');
num_nodes = num_nodes{5};
header = textscan(fid,'%s',7,'delimiter', '\t');
k = 0;
while ~feof(fid)
line = fgetl(fid);
[head,rem] = strtok(line,[' ',char(9)]);
if head == '#'
k = k+1;
j = 1;
time_steps(k) = sscanf(rem, [' Output at t = %d']);
end
if ~isempty(head)
if head ~= '#'
data(j,:,k) = str2num([head rem]);
j = j+1;
end
end
end
fclose(fid);
nodal_data = struct('header',header,'num_nodes',num_nodes,'time_steps',time_steps,'data',data);
我正在读到 Matlab 的 ascii 看起来像这样:
# Number of Nodes: 120453
#X Y Z depth vel_x vel_y wse
# Output at t = 0
76456.003 184726 3815.75 0 0 0 3815.75
76636.003 184726 3728.25 0 0 0 3728.25
76816.003 184726 3627 0 0 0 3627
76996.003 184726 3527.75 0 0 0 3527.75
77176.003 184726 3371.5 0 0 0 3371.5
# Output at t = 36000.788
76456.003 184726 3815.75 0 0 0 3815.75
76636.003 184726 3728.25 0 0 0 3728.25
76816.003 184726 3627 0 0 0 3627
76996.003 184726 3527.75 0 0 0 3527.75
77176.003 184726 3371.5 0 0 0 3371.5
虽然我编写的代码适用于非常小的文件,但对于较大的 ascii 文件,它却让我大吃一惊。我已经不得不中止加载 ~25mb ascii(大约 240k 行),这只是一个测试文件。该文件的更高版本将约为 500mb。有没有一种方法可以加快加载文件的过程我对 3 个 if 语句不满意,但我不知道如何用开关将“#”与数字分开,特别是因为我无法按类区分 'head',即我试图检查 ischar 或 isnumeric,但由于变量 'head' 被读取为字符串,它总是会出现这种情况,ischar
而且永远不会isnumeric
= true
。我也不太喜欢使用标记器来使用 if-cases,然后在这里拼凑一行:str2num([head rem]);
,因为这可能会消耗大量时间。但是,我不知道该怎么做。因此,如果您对如何调整我的代码有任何有用的建议,我将不胜感激!
祝你星期天愉快,提前谢谢你!