MATLAB:寻找更快/更优雅的方法来计算很长时间序列的移动中值绝对偏差
我有一个非常大的阵列,有五个通道和大约600万个条目(5 x 6000000)。我的目标是用一个7点窗口扫过阵列,并去除“尖峰”,尖峰被定义为比中值绝对偏差(MAD)更大的缩放量 我只运行时间序列的10000个初始点来测试代码。目前,我跑完前10000分大约需要3秒钟。我在一台相对较旧的32位戴尔笔记本电脑上运行,它有2.30GHz处理器和4GB内存。显然,如果我使用的是更新的计算机,我可以很快完成任务。例如,我的功能更强大的桌面在0.7秒内完成相同的任务。但是,我需要在笔记本电脑上运行代码,并且不能每次需要运行代码时都等待35-40分钟。我正在寻找帮助,寻找效率低下的地方,我可以使代码更快 下面是代码。如有任何关于如何提高速度的建议,我们将不胜感激。我注意到“MAD”的计算是最耗时的(大约需要1.9秒,或超过总时间的一半) 我觉得可能有一种更优雅的方式来执行“repmat”命令 欢迎提出任何意见 干杯 如有任何关于如何提高速度的建议,我们将不胜感激 你可以通过不重复你的MATLAB:寻找更快/更优雅的方法来计算很长时间序列的移动中值绝对偏差,matlab,performance,median,large-data,Matlab,Performance,Median,Large Data,我有一个非常大的阵列,有五个通道和大约600万个条目(5 x 6000000)。我的目标是用一个7点窗口扫过阵列,并去除“尖峰”,尖峰被定义为比中值绝对偏差(MAD)更大的缩放量 我只运行时间序列的10000个初始点来测试代码。目前,我跑完前10000分大约需要3秒钟。我在一台相对较旧的32位戴尔笔记本电脑上运行,它有2.30GHz处理器和4GB内存。显然,如果我使用的是更新的计算机,我可以很快完成任务。例如,我的功能更强大的桌面在0.7秒内完成相同的任务。但是,我需要在笔记本电脑上运行代码,并
中间值(idata)
第二次呼叫来收紧你的代码
更改此项:
mad=中位数(abs(idata-repmat)(中位数(idata),[nwide 1]))代码>
为此:
mad=中位数(绝对绝对值(平均值,[nwide 1]))代码>
或者,您可以从功能中获得更多里程,这是2006年之前的事。不过,您需要更改变量名
例如,您可以通过以下方式更改代码:
mad = median(abs(idata-repmat(median(idata),[nwide 1])));
mad = max([mad;minmad*ones(1,5)]); %minmad threshold added
到
我刚刚把2的向量放在那里,因为代码中没有显示正在更新的minmad
。你能用movmidian
得到移动的中间值吗
med = movmedian(data,7,2,'Endpoints','discard');
尽可能避免for循环
例如:
data = randn([5,1E6]);tic;
med = movmedian(data,7,2); %moving median
dev = abs(data-med); %deviation from median
thres = median(dev,2); %threshold
rep = dev>thres; %points to replace
data(rep) = med(rep); %replace data with median
toc
>>Elapsed time is 0.285828 seconds.
memory
>>Memory used by MATLAB: 1629 MB (1.708e+09 bytes)
移除峰值时,是否会影响未来窗口中的计算?从代码中可以看出。在这种情况下,很难避免一个循环。我必须进一步考虑这个问题,但第一件事是,你可以做array scalar
,而不必重复它。这可能会为您节省一些时间。matlab的mad
命令不太可能有帮助。我查看了源代码,这正是他的实现,开销更大。可能需要更长的时间,除非2017b之前的版本将其混合,并且出于任何原因将其更改回原来的版本。@Durkee我明白你所说的mad()
。希望调用median(idata)
一次而不是两次仍能对一些人有所帮助。
med = movmedian(data,7,2,'Endpoints','discard');
data = randn([5,1E6]);tic;
med = movmedian(data,7,2); %moving median
dev = abs(data-med); %deviation from median
thres = median(dev,2); %threshold
rep = dev>thres; %points to replace
data(rep) = med(rep); %replace data with median
toc
>>Elapsed time is 0.285828 seconds.
memory
>>Memory used by MATLAB: 1629 MB (1.708e+09 bytes)