首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >N周期移动斜率的矢量化方法

N周期移动斜率的矢量化方法
EN

Stack Overflow用户
提问于 2016-06-07 00:31:41
回答 2查看 155关注 0票数 3

有没有人能帮我把移动坡度计算矢量化。我试图消除for循环,但我不确定如何做到这一点。

代码语言:javascript
运行
复制
>> pv = [18 19 20 20.5 20.75 21 21.05 21.07 21.07]'; %% price vector 

>> slen = 3; %% slope length

function [slope] = slope(pv , slen)
svec = (1:1:slen)';
coef = [];
slope = zeros(size(pv));

for i = slen+1 : size(pv,1)
      X = [ones(slen,1) svec];
      y = pv( (i - (slen-1)) : i );
      a = X\y;
      slope(i,1) = a(2); 
end

>> slp = slope(pv,3)

slp =
        0
        0
        0
     0.75
    0.375
     0.25
     0.15
    0.035
     0.01

谢谢

EN

回答 2

Stack Overflow用户

发布于 2016-06-07 03:24:07

编辑:完全更改答案以使其可伸缩

代码语言:javascript
运行
复制
function [slope] = calculate_slope(pv , slen)  %% Note: bad practice to give a function and variable the same name

svec = (1:1:slen)';
X = [ones(slen,1) svec];

%% the following two lines basically create the all the sliding windows of length slen (as a submatrix of a larger matrix)
c = repmat ( flipud(pv), 1, length(pv))
d = flipud(reshape(c(1:end-1), length(pv)-1, length(pv) + 1));

%% then run MATLAB solver with all windows simultaneously
least_sq_result = X\d( end - slen + 1:end, (slen+1):end);
slope = [zeros(slen-1, 1); least_sq_result(2,:)'];  %% padding with zeros is optional

编辑:固定交换索引

票数 1
EN

Stack Overflow用户

发布于 2016-06-07 09:45:17

使用最小二乘回归在滑动窗口中找到斜率相当于一阶Savitzy-Golay滤波(使用微分滤波器)。SG滤波的概念是在滑动窗口中进行局部多项式拟合,然后使用局部模型对信号进行平滑或计算其导数。当数据点在时间上均匀分布时(就像这里一样),通过预先计算一组滤波器系数,然后将它们与数据卷积,可以非常有效地运行计算。这应该比构建一个巨大的矩阵并对其进行回归要快得多。

这是一种非常标准的技术,而且肯定会有现成的matlab代码流传开来。搜索“Savitzky-Golay differentiation”之类的东西。请注意,SG过滤器也可以执行平滑( matlab内置SG过滤函数执行此操作),但您需要执行区分的版本。

Savitzky and Golay (1964).用简化的最小二乘法

实现数据的平滑和微分

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37662537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档