0

我正在运行一个大循环来逐点分析数据,但现在我需要做我想要被忽略的运行平均值。

%In-Flight Tag Averaging Center%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%HPOT DP%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    if PWRLVLCMDGPC(i) == 104 && time(i) > 86200
        if HPOTDP(i) ~= -1 && perf_case_c == -1
            hpotp_if_c(i) = HPOTDP(i) - hpot_pcp_c(i); 
            fun = @(x) mean(x(:));
            hpotp_rep_c = nlfilter( hpotp_if_c,[1 20],fun);
        end
    end

照原样,代码将卡在nlfilter. 任何人都可以看到解决这个问题的方法吗?

最终意图是计算 hpotp_if_c 的滑动(移动)平均值,因此 mean(1:20) 将是向量 hpotp_rep_c 的第一个点,mean (2:21) 将是第二个等。

我只想再次指出,所有这些操作都需要在更大的 for 循环内完成,因此这些函数实际上并不能正常工作

4

1 回答 1

1

似乎nlfilterJIT 并不真正支持:

fun = @(x) mean(x(:))

a=rand(1,7000);

feature accel on

tic
nlfilter(a,[1,20],fun);
toc

feature accel off

tic
nlfilter(a,[1,20],fun);
toc

输出

fun = 

    @(x)mean(x(:))

Elapsed time is 0.764700 seconds.
Elapsed time is 0.914575 seconds.

在 1 到 7000 循环内调用将花费您大约 1.5 小时来计算:(

您可以for使用类似的东西对整个循环进行矢量化(强调“类似”,没有运行此代码,因此它可能无法复制粘贴)

A=(PWRLVLCMDGPC== 104).*(time > 86200).*(HPOTDP ~= -1).*(perf_case_c == -1);

hpotp_if_c(A) = HPOTDP(A) - hpot_pcp_c(A); 

hpotp_rep_c = nlfilter( hpotp_if_c,[1 20],fun);

毕竟,您的旧循环hpotp_rep_c一遍又一遍地覆盖所有值。

于 2013-07-25T08:32:15.287 回答