Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB:寻找更快/更优雅的方法来计算很长时间序列的移动中值绝对偏差_Matlab_Performance_Median_Large Data - Fatal编程技术网

MATLAB:寻找更快/更优雅的方法来计算很长时间序列的移动中值绝对偏差

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秒内完成相同的任务。但是,我需要在笔记本电脑上运行代码,并

我有一个非常大的阵列,有五个通道和大约600万个条目(5 x 6000000)。我的目标是用一个7点窗口扫过阵列,并去除“尖峰”,尖峰被定义为比中值绝对偏差(MAD)更大的缩放量

我只运行时间序列的10000个初始点来测试代码。目前,我跑完前10000分大约需要3秒钟。我在一台相对较旧的32位戴尔笔记本电脑上运行,它有2.30GHz处理器和4GB内存。显然,如果我使用的是更新的计算机,我可以很快完成任务。例如,我的功能更强大的桌面在0.7秒内完成相同的任务。但是,我需要在笔记本电脑上运行代码,并且不能每次需要运行代码时都等待35-40分钟。我正在寻找帮助,寻找效率低下的地方,我可以使代码更快

下面是代码。如有任何关于如何提高速度的建议,我们将不胜感激。我注意到“MAD”的计算是最耗时的(大约需要1.9秒,或超过总时间的一半)

我觉得可能有一种更优雅的方式来执行“repmat”命令

欢迎提出任何意见

干杯

如有任何关于如何提高速度的建议,我们将不胜感激

你可以通过不重复你的
中间值(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)