如何使MATLAB for循环更快

时间:2017-05-27 12:40:30

标签: matlab

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

3 个答案:

答案 0 :(得分:1)

通过查看代码,我会想到这些:

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

答案 1 :(得分:1)

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

编辑: 例如。像这样:

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

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

答案 2 :(得分: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循环。如果您不理解它,您可以使用我已注释掉的for循环