我正在处理一个包含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
答案 0 :(得分:1)
通过查看代码,我会想到这些:
答案 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循环