[英]Reduce assignment time in MATLAB
我需要在程序中自動創建變量。 我編寫了以下MATLAB代碼,以創建唯一變量並為其分配值。 但是, eval
需要很多時間。
for i=1:22
for j=1:54
s=strcat(num2str(i),num2str(j));
name1=strcat('wave',s);
add=strcat('F:\MIT Corpus\train\f',num2str(i),'\phrase0',num2str(j),'_16k.wav');
(eval( [ sprintf(name1) '=wavread(add)'] ));
end
end
有什么方法可以使此代碼運行更快?
知道eval
本質上是緩慢的,很少有用。
而不是不同的變量wave1
, wave2
...為什么不使用單元格數組 ?
for ii = 1:22
for jj = 1:54
name1 = strcat('wave',s);
str = sprintf('F:\\MIT Corpus\\train\\f%d\\phrase0\\%d_16k.wav', ii, jj);
wave{ii, jj} = wavread(str);
end
end
要訪問位於( i , j )位置的單元格,請使用花括號( {}
),例如wave{1, 2}
是位置(1、2)處單元格的內容。
還要注意,我已經用sprintf
替換了strcat
。 更加優雅,不是嗎?
我無法評估eval
因為我沒有這些wave文件,但是如果沒有eval行,您可以執行以下操作:
for i=1:22
istr = int2str(i);
for j=1:54
jstr = int2str(j);
name1= ['wave',jstr, jstr ];
add = ['F:\MIT Corpus\train\f', istr, '\phrase0',jstr,'_16k.wav'];
% eval( [ sprintf(name1) '=wavread(add)'] );
end
end
相比於原始代碼的0.946s(無eval),此更改在我的PC上僅需要0.09s。
您也可以這樣做,它應該更快:
for i=1:22
istr = int2str(i);
for j=1:54
jstr = int2str(j);
add = ['wave',jstr, jstr, '=wavread(F:\MIT Corpus\train\f', istr,'\phrase0',jstr,'_16k.wav)'];
% eval( add );
end
end
可以按以下方式並行閱讀(基於小寫的Eitan T anwser):
% close matlabpool if exists
if matlabpool('size') > 0
matlabpool close;
end
% no of wave files to read
NO_OF_FILES = 22*54;
% preallocate waveCell for files to be readed into
waveCell = cell(1, NO_OF_FILES);
% make ii and jj wave string names to be used
waveNameCell = cell(1, NO_OF_FILES);
idx = 1;
for ii = 1:22
for jj = 1:54
waveNameCell{idx} = {int2str(ii), int2str(jj)};
idx = idx + 1;
end
end
% create 6 matlab workers (6 is max default in 2013a),
% if u want more, matlab will give en error
% but will also tell how to change it to more, very easy.
% Off course, its best to how no more workers than cores/threads/cpus, etc.
matlabpool(6);
% execute this loop in parallel using matlab workers
% each worker will read one wave file
parfor wavei = 1:NO_OF_FILES
waveName = waveNameCell{wavei};
ii = waveName{1};
jj = waveName{2};
str = sprintf('F:\\MIT Corpus\\train\\f%d\\phrase0\\%d_16k.wav', ii, jj);
waveCell{wavei} = wavread(str);;
end
matlabpool close;
但瓶頸可能在於,從硬盤驅動器同時讀取多個文件比讀取一個文件要慢。 也許更少的工人會更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.