gpt4 book ai didi

matlab - 优化代码,去掉 "for loop"

转载 作者:太空宇宙 更新时间:2023-11-03 20:04:54 27 4
gpt4 key购买 nike

根据 Brownlees & Gallo 2006(如果您可能感兴趣),我正在尝试从报价数据系列中删除异常值。

代码运行良好,但考虑到我正在处理非常长的向量(最大的向量有 20m 的观察值,20 小时后还没有完成计算)我想知道如何加快它的速度。

到目前为止我所做的是:
我将时间和日期格式更改为 numeric double,我发现它节省了相当多的处理时间和大量内存。
我为向量分配了内存:

[n] = size(price);
x = price;
score = nan(n,'double'); %using tic and toc I saw that nan requires less time than zeros
trimmed_mean = nan(n,'double');
sd = nan(n,'double');
out_mat = nan(n,'double');

这是我想删除的循环。我读到矢量化会加速很多,尤其是使用长矢量。

for i = k+1:n
trimmed_mean(i) = trimmean(x(i-k:i-1 & i+1:i+k),10,'round'); %trimmed mean computed on the 'k' closest observations to 'i' (i is excluded)
score(i) = x(i) - trimmed_mean(i);
sd(i) = std(x(i-k:i-1 & i+1:i+k)); %same as the mean
tmp = abs(score(i)) > (alpha .* sd(i) + gamma);
out_mat(i) = tmp*1;
end

这是我想做的

trimmed_mean=trimmean(regroup_matrix,10,'round',2);
score=bsxfun(@minus,x,trimmed_mean);
sd=std(regroup_matrix,2);
temp = abs(score) > (alpha .* sd + gamma);
out_mat = temp*1;

但考虑到我是 Matlab 的新手,我不知道如何正确构建相邻观察矩阵。我只是认为它的形状应该是这样的:regroup_matrix= nan (n,2*k)

编辑:具体来说,我想做的(但我做不到)是:
给定“x”中每个观察值“i”的列向量“x”(n,1)我想将“k”个相邻观察值带到“i”(从 i-k 到 i-1 和从 i+1 到 i +k) 并将这些观察结果作为矩阵的行 (n, 2*k)。

编辑 2:我对代码做了一些更改,我认为我离解决方案越来越近了。我发布了另一个问题,专门针对我认为现在的问题:
Matlab: Filling up matrix rows using moving intervals from a column vector without a for loop

我现在要做的是:

[n] = size(price,1);
x = price;
[j1]=find(x);
matrix_left=zeros(n, k,'double');
matrix_right=zeros(n, k,'double');
toc
matrix_left(j1(k+1:end),:)=x(j1-k:j1-1);

matrix_right(j1(1:end-k),:)=x(j1+1:j1+k);

matrix_group=[matrix_left matrix_right];
trimmed_mean=trimmean(matrix_group,10,'round',2);
score=bsxfun(@minus,x,trimmed_mean);
sd=std(matrix_group,2);
temp = abs(score) > (alpha .* sd + gamma);
outmat = temp*1;

我在创建 matrix_left 和 matrix_right 时遇到问题。我用于索引的 j1 是一个包含价格观察指标的列向量。输出很简单

j1=[1:1:n]

price 是一个 double 的列向量,大小为 (n,1)

最佳答案

对于 reshape ,您可以执行以下操作:

idxArray = bsxfun(@plus,(k:n)',[-k:-1,1:k]);
reshapedArray = x(idxArray);

关于matlab - 优化代码,去掉 "for loop",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21634394/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com