我有称为参考一个“父”的文本文件,它是:优化此代码?
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
的想法是,以产生一组类似的文件,仅改变4个确定的上述文件的行(LENGTH,STEP,UBAR,SEED )。
目前我使用此代码:
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一大一,尤其是文本/结构操作。
我希望你能耐心等待我。
问候。
我提前感谢大家。
最亲切的问候, 弗朗切斯科
所以我把它们作为一些其他程序的配置文件。设置的顺序是否重要,或者它们可以以任何顺序? –
查看编辑我的答案。这在这里工作(R2010a)。如果您有任何问题,请告诉我。 –
你为什么要在Matlab内做到这一点?例如在Linux上,您可以使用像sed这样的工具轻松替换部分文本文件 – steabert