首页 > 其他分享 >三次插值

三次插值

时间:2022-08-23 17:35:58浏览次数:73  
标签:const 函数 插值 double 三次 DATA DIMENSION

优化问题通常涉及以值表形式给出的函数,例如一幅图像。计算这些函数以及他们的导数需要对这些值进行插值。插值表格函数是一个广泛的研究领域,有许多库已经实现了一些插值问题。然而,在cere的自动求导框架中去是很困难的。为此,ceres提供了对一维和两维的表格函数的插值能力。

一维的插值是基于Cubic Hermite Spline,也称为Catmull-Rom Spline。这生成一阶差分插值函数。二维插值格式是一维插值格式的推广,在两维中一维的插值函数是分开的。

更多细节参考:More details of the construction can be found Linear Methods for Image Interpolation by Pascal Getreuer.

class CubicInterpolator

给定一个无限的一维网格作为输入,其提供了以下接口:

struct Grid1D {
  enum { DATA_DIMENSION = 2; };
  void GetValue(int n, double* f) const;
};

函数GetValue给出了一个函数f(可能是向量值)的值,在给定任意的n和用于指示被插函数的维度DATA_DIMENSION。例如:如果打算以角轴的格式插值旋转,那么DATA_DIMENSION=3。

CubicInterpolator 使用Cubic Hermite splines来生成一个平滑的近似于它的值,其可以用来估计f(x)以及f'(x)在任何的实数线上的点。例如,以下代码对四个元素的数组进行插值。

const double x[] = {1.0, 2.0, 5.0, 6.0};
Grid1D<double, 1> array(x, 0, 4);
CubicInterpolator interpolator(array);
double f, dfdx;
interpolator.Evaluate(1.5, &f, &dfdx);

以上代码使用Grid1D模板类来与c++数组和CubicInterpolator相交互。

Grid1D支持向量值函数其中函数的各种坐标可以交错或堆叠。它还允许使用任何数字类型作为输入,只要它可以安全地转换为double。

 

class BiCubicInterpolator

给定一个无线二维网格作为输入,该网格提供以下接口:

struct Grid2D
{
 enum {DATA_DIMENSION = 2};
void GetValue(int row, int col, double* f) const;
}

GetValue函数给出函数f(可能是向量值)在任何整数对row和col下的值;DATA_DIMENSION指出被插值函数的维数。例如,如果想对一副彩色图有三个通道进行插值,那么DATA_DIMENSION=3。

BiCubicInterpolator使用三次卷积插值算法R.keys来生成一个平滑的近似值,可以用来计算在实平面中任一点的

例如以下代码对一个二维数组进行插值:

const double data[] = {1.0, 3.0, -1.0, 4.0,
                       3.6, 2.1,  4.2, 2.0,
                       2.0, 1.0,  3.1, 5.2};
Grid2D<double, 1>  array(data, 0, 3, 0, 4);
BiCubicInterpolator interpolator(array);
double f, dfdr, dfdc;
interpolator.Evaluate(1.2, 2.5, &f, &dfdr, &dfdc);

以上代码,模板类Grid2D用于让c++数据像一个两维的表对于BiCubicInterpolator来说。

Grid2D支持行或列优先的布局。它支持向量值函数,其中,函数的各个坐标可以交错或堆叠。它还允许使用任何数字类型作为输入,只要它可以安全地转换为double。

 

标签:const,函数,插值,double,三次,DATA,DIMENSION
From: https://www.cnblogs.com/gary-guo/p/16617120.html

相关文章

  • 一元三次方程
    根的绝对值>=1,可知在区间[i,i+1]内最多只有一个解。将(-100,100)for循环分成若干区间令l=i,r=i+1;判断f(l)是否为0,再判断f(r)是否为0,如果为0,直接跳过。当左右点都不为0时......
  • [NOIP2001 提高组] 一元三次方程求解
    题目链接:https://www.luogu.com.cn/problem/P1024试题分析:三个答案都在[-100,100]范围内,两个根的差的绝对值>=1,保证了每一个大小为1的区间里至多有1个解,也就是说当区间......
  • 慢SQL抓包与TCP 三次握手4次挥手的原因
                                                        来......
  • [NOIP2001 提高组] 一元三次方程求解
    [NOIP2001提高组]一元三次方程求解题目描述:这道题就是一道简单的暴力枚举,做的时候要注意一下double精度,当然用二分做的话肯定会更好(虽然我也不会)代码如下:#include<......
  • 2. [NOIP2001 提高组] 一元三次方程求解
    试题描述:输入一行,4个实数a,b,c,d输出一行,3个实根,从小到大输出,并精确到小数点后2位。样例输入1-5-420样例输出-2.002.005.00错误代码如下(会没有......
  • [NOIP2001 提高组] 一元三次方程求解
    以0.01精度在[-100,100]枚举根。#include<iostream>#include<iomanip>intmain(){doublea,b,c,d;std::cin>>a>>b>>c>>d;for(doublex=-100.0;x<=100.......
  • 计算机网络基础--TCP 三次握手过程
    假设有一个发送方计算机和一个接收方计算机,纵向为时间轴第一次握手假设首先是发送方主动和接收方建立连接,所以,发送方会第一次发送一个报文(此时SYN=1,表示这是一个连接请......
  • 三次握手,四次挥手
    三次握手  连接建立阶段:第一次握手:客户端的应用进程主动打开,并向服务端发出请求报文段。其首部中:SYN=1,seq=x。第二次握手:服务器应用进程被动打开。若同意客户端的......
  • Python 字符串插值 All In One
    Python字符串插值AllInOne#!/usr/bin/envpython3#coding=utf-8__author__='xgqfrms'__editor__='vscode'__version__='1.0.1'__copyright__="""Co......
  • 画图TCP协议和三次握手及四次挥手
    1.TCP协议1.1.TCP特性1.TCP提供一种面向连接的、可靠的字节流服务在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP2.TCP使用校验和,确认和重传机制来保......