私はうまく動作するこのコードを書きましたが、私の目的には遅すぎます:
%%% 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 ファイルではうまくいきません。単なるテスト ファイルである ~25 MB の ascii (約 240k 行) の読み込みを既に中止する必要がありました。ファイルのそれ以降のバージョンは ~500mb になります。ファイルをロードするプロセスをスピードアップする方法はありますか? 3 つの if ステートメントには満足できませんが、先頭にあるスイッチを使用して数字から '#' を分離する方法がわかりませんでした。クラスごとに 'head' を区別します。つまり、ischar または isnumeric をチェックしようとしましたが、変数 'head' は文字列として読み取られるため、常に = の場合にischar
なり、決してisnumeric
=になることはありませんtrue
。また、if-cases を使用できるようにするためにトークナイザーを使用してから、次の行をまとめることにもあまり満足していません。str2num([head rem]);
、これはおそらく多くの時間を消費します。しかし、私はそれを行う方法を知りませんでした。したがって、私のコードをどのように適応させるかについて何か有益な提案があれば、非常に感謝しています!
よい日曜日を、よろしくお願いします!