参照と呼ばれる「親」テキストファイルがあります。これは次のとおりです。
VERSION 3.82
CALCULATION 3
OPTIONS 0
PROJNAME
DATE
ENGINEER
NOTES ""
PASSWORD
MSTART CONSTANTS
RHO 1.225
RHOW 1027
VISCOS .0000182
GRAVITY 9.81
MEND
MSTART WINDND
SPMODEL 7
NLAT 31
NVER 45
LATDIM 150
VERDIM 220
LONGLS 340.2
LATLS 0
VERTLS 0
XLV 113.4
YLV 0
ZLV 0
XLW 27.72
YLW 0
ZLW 0
LAMBDA1 0
CohScale 12
COHDEC 3
SCALE 33.6
GAMMA 3.9
YDIML 0
N2 32
YDIMS 0
K1MIN 3
LENGTH 1830
STEP .2233888
UBAR 3
SEED 12
OUTFILE None
DIAM 0
HUBHT 0
TURBHTTYPE 0
TURBBOTTOM 0
GUSTAVT 0
GUSTSPEED 0
TOLERANCE 0
DLONGMIN 0
DLONGMAX 0
Z0MIN 0
Z0MAX 0
MAXITER 14
MAXSEED 100
NFILES 1
UseWindShear 0
WVMODEL 0
MATCHFILE ''
SPACING 0
SAMPLEFREQ 0
MEANSPEED 0
ILAT 0
IVERT 0
GUSTMETHOD 0
DLONG 0
ILAT 0
IVERT 0
LONGGUST 0
LATGUST 0
VERTGUST 0
iLONGGUST 0
iLATGUST 0
iVERTGUST 0
PEAKINESS 0
MAXFRAN 0
MEND
0CONSTANTS
0WINDND
アイデアは、上記のファイル(LENGTH、STEP、UBAR、SEED)の4つの決定された行のみを変更して、一連の同様のファイルを生成することです。
現在、私はこのコードを使用しています:
clc
clear all
close all
V = [4 6 8 10 12 14 16 18 20 22 24 26 28 29];
for j = 1:6
f1 = ['D:\01_department\DLC1-2']
if exist(f1,'dir') ~= 7
mkdir(f1);
end
fname = [f1 '\' 's0' num2str(j)];
if exist(fname,'dir') ~= 7
mkdir(fname);
end
for i = 1:length(V),
filename = [fname '\' num2str(V(i)) '.$PJ'];
fid = fopen(filename,'w');
fprintf(fid, 'VERSION 3.82\r\n')
fprintf(fid, 'CALCULATION 3\r\n')
fprintf(fid, 'OPTIONS 0\r\n')
fprintf(fid, 'PROJECTNAME\t\r\n')
fprintf(fid, 'DATE\t\r\n')
fprintf(fid, 'ENGINEER\t\r\n')
fprintf(fid, 'NOTES\t""\r\n')
fprintf(fid, 'PASSWORD\t\r\n')
fprintf(fid, 'MSTART CONSTANTS\r\n')
fprintf(fid, 'RHO 1.225\r\n')
fprintf(fid, 'RHOW 1027\r\n')
fprintf(fid, 'VISCOS 0.0000182\r\n')
fprintf(fid, 'GRAVITY 9.81\r\n')
fprintf(fid, 'MEND\r\n')
fprintf(fid, '\r\n')
fprintf(fid, 'MSTART WINDND\r\n')
fprintf(fid, 'SPMODEL 7\r\n')
fprintf(fid, 'NLAT 31\r\n')
fprintf(fid, 'NVER 45\r\n')
fprintf(fid, 'LATDIM 150\r\n')
fprintf(fid, 'VERDIM 220\r\n')
fprintf(fid, 'LONGLS 340.2\r\n')
fprintf(fid, 'LATLS 0\r\n')
fprintf(fid, 'VERTLS 0\r\n')
fprintf(fid, 'XLV 113.4\r\n')
fprintf(fid, 'YLV 0\r\n')
fprintf(fid, 'ZLV 0\r\n')
fprintf(fid, 'XLW 27.72\r\n')
fprintf(fid, 'YLW 0\r\n')
fprintf(fid, 'ZLW 0\r\n')
fprintf(fid, 'LAMBDA1 0\r\n')
fprintf(fid, 'CohScale 12\r\n')
fprintf(fid, 'COHDEC 3\r\n')
fprintf(fid, 'SCALE 33.6\r\n')
fprintf(fid, 'GAMMA 3.9\r\n')
fprintf(fid, 'YDIML 0\r\n')
fprintf(fid, 'N2 32\r\n')
fprintf(fid, 'YDIMS 0\r\n')
fprintf(fid, 'K1MIN 3\r\n')
fprintf(fid, 'LENGTH %g\r\n', V(i)*610)
fprintf(fid, 'STEP %g\r\n', V(i)/13.4295)
fprintf(fid, 'UBAR %g\r\n', V(i))
fprintf(fid, 'SEED %i\r\n', randi(999,1))
fprintf(fid, 'OUTFILE None\r\n')
fprintf(fid, 'DIAM 0\r\n')
fprintf(fid, 'HUBHT 0\r\n')
fprintf(fid, 'TURBHTTYPE 0\r\n')
fprintf(fid, 'TURBBOTTOM 0\r\n')
fprintf(fid, 'GUSTAVT 0\r\n')
fprintf(fid, 'GUSTSPEED 0\r\n')
fprintf(fid, 'TOLERANCE 0\r\n')
fprintf(fid, 'DLONGMIN 0\r\n')
fprintf(fid, 'DLONGMAX 0\r\n')
fprintf(fid, 'Z0MIN 0\r\n')
fprintf(fid, 'Z0MAX 0\r\n')
fprintf(fid, 'MAXITER 14\r\n')
fprintf(fid, 'MAXSEED 100\r\n')
fprintf(fid, 'NFILES 1\r\n')
fprintf(fid, 'UseWindShear 0\r\n')
fprintf(fid, 'WVMODEL 0\r\n')
fprintf(fid, 'MATCHFILE %c\r\n', '')
fprintf(fid, 'SPACING 0\r\n')
fprintf(fid, 'SAMPLEFREQ 0\r\n')
fprintf(fid, 'MEANSPEED 0\r\n')
fprintf(fid, 'ILAT 0\r\n')
fprintf(fid, 'IVERT 0\r\n')
fprintf(fid, 'GUSTMETHOD 0\r\n')
fprintf(fid, 'DLONG 0\r\n')
fprintf(fid, 'ILAT 0\r\n')
fprintf(fid, 'IVERT 0\r\n')
fprintf(fid, 'LONGGUST 0\r\n')
fprintf(fid, 'LATGUST 0\r\n')
fprintf(fid, 'VERTGUST 0\r\n')
fprintf(fid, 'iLONGGUST 0\r\n')
fprintf(fid, 'iLATGUST 0\r\n')
fprintf(fid, 'iVERTGUST 0\r\n')
fprintf(fid, 'PEAKINESS 0\r\n')
fprintf(fid, 'MAXFRAN 0\r\n')
fprintf(fid, ' MEND\r\n')
fprintf(fid, '\r\n')
fprintf(fid, '0CONSTANTS\r\n')
fprintf(fid, '0WINDND\r\n')
fclose(fid)
end
end
しかし、このように、コードはほとんどの時間を出力の書き込みに費やします。参照ファイルの読み取り(fopen()または他のコマンドを使用)と変更(印刷)のみで同じことをもっと実行したい
fprintf(fid, 'LENGTH %g\r\n', V(i)*610)
fprintf(fid, 'STEP %g\r\n', V(i)/13.4295)
fprintf(fid, 'UBAR %g\r\n', V(i))
fprintf(fid, 'SEED %i\r\n', randi(999,1))
新しいファイル内。
誰かがこの結果を達成する方法を知っていますか?可能であれば、forループを使用する代わりにベクトル化することもできます。
そうでなければ、私はこの種のプロセスを考えていました。答えをありがとう、そしてコードを私と共有してくれてありがとう。
お気づきかもしれませんが、コードはブロックで構成されています。ブロックは「MSTART」で始まり、「MEND」で終わります。各MSTARTの後には、単一ブロックのラベル/名前が続きます。
この場合、ブロックはCONSTANTSとWINDNDです。次のことが可能かどうか疑問に思います。
1.read the parent file;
2.find the different block the parent file presents;
3.store the information/strings of each block in a Matlab structure;
4.write new files just recalling the blocks of the parent file;
5.look for strings LENGTH, STEP, UBAR, SEED;
6.update the above string with the corresponding formula;
7.store in a specified folder.
コードの先頭は次のようになります。
%# read lines
fid = fopen('file.txt','rt');
C = textscan(fid, '%s', 'Delimiter','\r\n');
C = C{1}; fclose(fid);
%# start/end of each structure
startIdx = find(ismember(C, 'MSTART'));
endIdx = find(ismember(C, 'MEND'));
しかし、私はMatlabの新入生であり、特にテキスト/構造の操作に精通しているだけなので、どのように進めるかわかりません。
我慢していただければ幸いです。
よろしく。
よろしくお願いします。
よろしく、フランチェスコ