PCHIP armadillo function



我正在尝试使用armadillo将一些MATLAB代码转换为C++,其中使用的MATLAB函数之一是interp1"足够简单";,我想,Armadillo有interp1"线性应该足够好";,我错了。所以我搜索了interp1.m的源代码,找到了Octave源代码,它使用了pchip.m,我找到了Octove源代码。但pchip。

所以,在我开始真正深入研究pchip的转换之前,有没有其他包含pchip在内的库或源代码可以供我使用?

如果其他人需要这个,我在这里查找方程。对于大型数据集,它似乎无法正常工作,因此使用矩阵公式,我创建了一个滑动窗口PCHIP interp。仍然与MATLAB不匹配,所以我用线性interp进行平均,非常接近。这样做正确吗?可能不会。。。它有效吗?是的!

void pchip_slide(const arma::vec& x, const arma::vec& y, const arma::vec& x_new, arma::vec& y_custom,const int M=4){
vec y_interp=zeros<vec>(size(x_new));
interp1(x,y,x_new,y_interp);
int I=0;
int start_interp=0;
int end_interp=0;
for(int ii=0;ii<x_new.n_elem;ii++){

I=index_min(abs(x-x_new(ii)));
start_interp=std::max((I-2),0);
end_interp=std::min((start_interp+M-1),int(numel(x)-1));

vec x_mini=x(span(start_interp,end_interp));
vec y_mini=y(span(start_interp,end_interp));
mat x_mat=ones<mat>(x_mini.n_elem,x_mini.n_elem);
for(int ll=0;ll<x_mini.n_elem-1;ll++){
x_mat.row(ll)=pow((x_mini.t()),(x_mini.n_elem-ll));
}
vec c_mini=solve( x_mat, y_mini,solve_opts::fast + solve_opts::no_approx);
rowvec x_pchip_mini=ones<rowvec>(x_mini.n_elem);
for (int ll=0;ll<x_mini.n_elem-1;ll++){
x_pchip_mini(ll)=pow((x_new(ii)),(x_mini.n_elem-ll));
}
y_custom(ii)=conv_to<double>::from(x_pchip_mini*c_mini);
if ((x_new(ii)>=x(0))&& (x_new(ii)<=x(x.n_elem-1))){
y_custom(ii)=(y_custom(ii)*1/M+y_interp(ii)*3/M);
}
}
return;
}

相关内容

  • 没有找到相关文章

最新更新