簡體   English   中英

減少在MATLAB中的分配時間

[英]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本質上是緩慢的,很少有用。

而不是不同的變量wave1wave2 ...為什么不使用單元格數組

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

要訪問位於( ij )位置的單元格,請使用花括號( {} ),例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM