0

参照と呼ばれる「親」テキストファイルがあります。これは次のとおりです。

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の新入生であり、特にテキスト/構造の操作に精通しているだけなので、どのように進めるかわかりません。

我慢していただければ幸いです。

よろしく。

よろしくお願いします。

よろしく、フランチェスコ

4

1 に答える 1

1

これは機能するはずです:

clc, clear all, close all

V = [4 6 8 10 12 14 16 18 20 22 24 26 28 29];


fid = fopen('parent.txt', 'r');
C = textscan(fid,'%s', 'delimiter', '\r\n');
C = C{1};
fclose(fid);

D = C;
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:numel(v)
        filename = [fname '\' num2str(V(i)) '.$pj'];

        D{strncmp('LENGTH', c, length('LENGTH'))} = ...
            sprintf('length %g', V(i)*610);

        D{strncmp('STEP', c, length('STEP'))} = ...
            sprintf('STEP %g', V(i)/13.4295);

        D{strncmp('UBAR', c, length('UBAR'))} = ...
            sprintf('UBAR %g', V(i));

        D{strncmp('SEED', c, length('SEED'))} = ...
            sprintf('SEED %i', randi(999,1));


        fid = fopen(filename,'w');        
        txt = sprintf([repmat('%s\r\n',1,size(d,1)),'\r\n'],d{:});        
        fprintf(fid, '%s', txt);        
        fclose(fid);

    end
end

これはまだ改善できます-置き換えられる文字列は理想的にはベクトル化されているか、コマンドに1回だけ入力されます。しかしまあ、これはすでにあなたにかなりのスピードアップを与えるはずです。

于 2012-08-23T08:48:15.570 に答える