Arrays Matlab大型阵列减号

Arrays Matlab大型阵列减号,arrays,matlab,parfor,Arrays,Matlab,Parfor,我正在尝试优化一个Matlab代码,以便对大量数据(1e6值)进行统计计算。我尝试了几种方法,使用循环或有趣的函数,使用diff或基本数学。 对我来说,这段代码运行大约8秒钟。虽然,使用附加的for循环可以运行良好的“run section”模式,但在运行脚本时它是不稳定的 是否有任何方法可以缩短此代码的时间。我尝试了parfor的不同方法,但无法在循环中设置它。这里有没有人对parfor有足够的经验来告诉我如何摆脱广播变量问题 %% Matlab Question L=400000; t_cl

我正在尝试优化一个Matlab代码,以便对大量数据(1e6值)进行统计计算。我尝试了几种方法,使用循环或有趣的函数,使用diff或基本数学。 对我来说,这段代码运行大约8秒钟。虽然,使用附加的for循环可以运行良好的“run section”模式,但在运行脚本时它是不稳定的

是否有任何方法可以缩短此代码的时间。我尝试了parfor的不同方法,但无法在循环中设置它。这里有没有人对parfor有足够的经验来告诉我如何摆脱广播变量问题

%% Matlab Question
L=400000;
t_clk = rand(1, L);
t_clk = t_clk-0.5;
plot (t_clk)
%
disp(' ')
tic
N = 1000; %2000
M = length(t_clk)-N;
temp_Pkp = zeros(1, N);
temp_Pkn = zeros(1, N);
temp_Std = zeros(1, N);
myMat = zeros(1,M);
% Time to execute: 'run section' / 'run' / 'run and time'
%parfor xx = 1 :1  : N  %2.3 -> broadcast variable issues
for xx = 1 :1  : N  %2.3

    myMat =  bsxfun(@minus,t_clk(xx+1 : xx+M) , t_clk(1:M)); %% Time to execute: 8.1s / 8.2s / 7.76s
    %myMat =  t_clk(xx+1 : xx+M) - t_clk(1:M); %% Time to execute: 8.1s / 8s / 86s
    %myMat = zeros(1,M); % not used
    %for yy = 1:1:M %% Time to execute: 4.6s / 4.6s / 23.6s ('run and time' execution time is very high)
    %    myMat(yy) =t_clk(xx+yy) - t_clk(yy);
    %end
    temp_Mean= mean(myMat) ;
    temp_Pkp(xx) = max(myMat(:)) - temp_Mean  ; % max - min
    temp_Pkn(xx) = temp_Mean  - min(myMat(:))  ; % max - min
    temp_Std(xx) = sqrt(sum(sum((myMat-temp_Mean).^2))/M);
end
toc
plot(temp_Std)

我做了一些修改,看起来你在重复索引一个变量,这花费了你很多。这个变量是
t\u clk
,每次都按
1:M
索引。如果使用此索引创建临时变量,则可以大大加快运行时的速度

%% Matlab Question
L=400000;
t_clk = rand(1, L);
t_clk = t_clk-0.5;
plot (t_clk)
%
disp(' ')
tic
N = 1000; %2000
M = length(t_clk)-N;
temp_Pkp = zeros(1, N);
temp_Pkn = zeros(1, N);
temp_Std = zeros(1, N);
myMat = zeros(1,M);
% Time to execute: 'run section' / 'run' / 'run and time'
%parfor xx = 1 :1  : N  %2.3 -> broadcast variable issues
t_clk_t = t_clk(1:M);
idx = 1:M;
for xx = 1 :1  : N  %2.3

    myMat =  bsxfun(@minus,t_clk(xx+1 : xx+M) , t_clk(1:M)); %% Time to execute: 3.043

    myMat =  bsxfun(@minus,t_clk(xx+1 : xx+M) , t_clk_t); % Time to execute 1.740

%     myMat = t_clk(xx+1 : xx+M) - t_clk(1:M);
    %myMat =  t_clk(xx+1 : xx+M) - t_clk(1:M); %% Time to execute: 8.1s / 8s / 86s
    %myMat = zeros(1,M); % not used
    %for yy = 1:1:M %% Time to execute: 4.6s / 4.6s / 23.6s ('run and time' execution time is very high)
    %    myMat(yy) =t_clk(xx+yy) - t_clk(yy);
    %end
    temp_Mean= mean(myMat) ;
    temp_Pkp(xx) = max(myMat(:)) - temp_Mean  ; % max - min
    temp_Pkn(xx) = temp_Mean  - min(myMat(:))  ; % max - min
    temp_Std(xx) = sqrt(sum(sum((myMat-temp_Mean).^2))/M);
end
toc
plot(temp_Std)

如果您描述了代码应该做什么,这会有所帮助。“这是代码,请快一点”不是一个格式正确的问题。
parfor
不是一根魔杖。阅读并回答其复杂之处。首先从矢量化开始,一旦代码得到充分优化,检查并行化是否能进一步帮助您。Hello@Wolfie。我在一开始写道,它对大量数据进行了一些统计计算。在这种情况下,向量t_clk是时钟信号的过零向量。通过以我的方式计算myMat,我可以计算此信号的基本抖动值:RMS、max和min。请回答您的问题,注释不是为了向任何答案添加关键的新信息。(1)
bsxfun
除了花费时间外,什么都不做。(2) 对代码计时时,将其放入函数中,并对函数调用计时。JIT可以更好地优化函数,因此通常运行得更快。忽略“运行和时间”的东西,重要的是函数运行的速度有多快。使用探查器查找热点。(3) 通过收集数组中的
mean(myMat)
max
min
进行优化,然后以矢量化方式计算循环外的其他值。(4) 使用
std
,不要自己翻滚。您好@Durkee,谢谢您的回答。我昨天在做这件事,我注意到了类似的事情。我在我的主代码中有额外的时间问题,因为我使用的是结构。普通变量+索引跳过帮助很大。我有另一个想法,我必须尝试:我注意到除以L/4…/10的时间比这个除以因子减少的多。我将不得不使用整形+一些额外的东西,以优化矩阵的基础上使用的索引。本周我们将努力完成这项工作,一旦准备就绪,我们将在这里输入代码。