2017-05-27 140 views
0

我正在處理包含10250 * 2數據的3750個文本文件的數據集。文件名是「Data_F_Ind0001到Data_F_Ind3750」。我編寫了一個代碼,逐個讀取每個文件的每一列,並執行經驗模式分解(EMD)。 EMD產生了四個變量I1至I4,並對這四個變量中的每一個執行一些其他功能(巖相)。代碼的問題是,它非常慢。任何人都可以建議如何讓它快速?我感謝您的幫助。謝謝。 我已經給出了處理前37個文件中的前9個文件的示例代碼。我已經使用相同的循環來處理剩餘的文件。如何使MATLAB for循環更快

clear all; 
close all; 
l =1; 
for k = 1:9 
filename = sprintf('Data_F_Ind000%d.txt',k); 
% a(:,:,k) = load(filename); 
data = load (filename); 
x = data(:,1); 
y = data (:,2); 

    alldata = eemd(x,0.01,10); 
    I1 = alldata (1,:); 
    I2 = alldata (2,:); 
    I3 = alldata (3,:); 
    I4 = alldata (4,:); 
    imf = {I1, I2, I3, I4}; 
    for j = 1:4 
     m1(k,j)= petropy(imf{j},3,1,'order'); 
     j=j+1; 
     l=l+1; 
    end   
end 
+0

,我不確定你爲什麼增加'j'和'l'。 j已經運行了值1,2,3,4。通過在循環內部增加它,你基本上正在浪費操作。另外,你沒有在任何地方使用'l'的值。 – anyanwu

回答

1

您似乎沒有爲m1(k,j)預分配內存。在for循環前添加m1 = zeros(3750,4)。 我假設m1()是一個數組,如果它是一個stuct或其他東西,相應地改變它。編號: E.g.像這樣:

clear all; 
close all; 
l =1; 
m1 = zeros(3750,4); 
for k = 1:9 
    .... 

與循環迭代產生的數據處理時,這是一個重要的話題 - 我建議你閱讀this article

+0

非常感謝Imoes。 – Dattaprasad

1

這些是通過看你的代碼在我腦海的事情:

  • 不要把數據的列變量x和y。通過這樣做,你使用了兩倍的內存。在你函數eemd中簡單地使用數據(:,1)作爲輸入。同樣的事情適用於I1到I4,但我想它的影響較小,因爲它們是小尺寸的變量。
  • 您可以嘗試textscan或fscanf而不是sprintf。這也應該改善你的代碼。
+0

謝謝Laleh。這幫助我改進了我的代碼。 – Dattaprasad

1

這裏是你的代碼更優化的版本:

m1 = zeros(3750, 4); 
for k = 1:9 
    filename = sprintf('Data_F_Ind000%d.txt',k); 
    data = load(filename); 
    alldata = eemd(data(:, 1),0.01,10); 
%  for j = 1:4 
%   m1(k,j)= petropy(alldata(j, :), 3, 1, 'order'); 
%  end 
    m1(k, :) = arrayfun(@(j) petropy(alldata(j, :), 3, 1, 'order'), 1:4); 
end 

我用arrayfun替換了內循環。如果你不理解它,你可以使用for循環,我已經在你的inner for循環中註釋掉了

+0

不是'arrayfun()'通常(總是?)比for循環慢嗎?但其他優化是整潔的,也更容易閱讀。 –

+0

謝謝ammportal優化代碼。我會嘗試相同的。感謝Imoes獲取更多信息。 – Dattaprasad

+0

@lmoes是的,我認爲在這種情況下'arrayfun'會變慢。它加速了大量的迭代 – anyanwu