如何使 MATLAB for 循环更快



>我正在处理一个包含 3750 个文本文件的数据集,每个文件包含 10240*2 个数据。文件名为"Data_F_Ind0001到Data_F_Ind3750"。我编写了一个代码来逐个读取每个文件的每一列,并执行了经验模式分解(EMD(。EMD产生四个变量I1到I4,对于这四个变量中的每一个,执行一些其他功能(石油(。代码的问题是,它非常慢。谁能建议如何让它变得快速?我感谢您的帮助。谢谢。我给出了处理 9 个文件中的前 3750 个文件的示例代码。我对其余文件使用了相同的 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

您似乎没有为m1(k,j)预先分配内存。在 for 循环前面添加m1 = zeros(3750,4)。我假设 m1(( 是一个数组,如果它是一个 stuct 或其他东西,请相应地更改它。

编辑:例如像这样:

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

在处理迭代生成数据的循环时,这是一个重要的主题 - 我建议阅读这篇文章

这些是我在查看您的代码时想到的事情:

  • 不要将数据列放在变量 x 和 y 中。通过这样做,您将使用两倍的内存。在你的函数中,eemd 只需使用 data(:,1( 作为输入。同样的事情适用于 I1 到 I4,但我想它的影响较小,因为它们是小尺寸变量。
  • 您可以尝试textscan或fscanf而不是sprintf。这也应该改进您的代码。

下面是代码的更优化版本:

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 循环。如果你不明白,你可以使用我已经注释掉的 for 循环

最新更新