我想将Eigen::spline
的样条插值包含到一个更大的公式中,并想借助Eigen::AutoDiff
确定这个公式的导数。
我尝试了以下代码:
#include <iostream>
#include <Eigen/Eigen>
#include <unsupported/Eigen/AutoDiff>
#include <unsupported/Eigen/Splines>
double array[] = {
1.0, 2.0,
3.0, 4.0,
5.0, 1.0,
6.0, 2.0
};
constexpr size_t nCols=2;
constexpr size_t rowSize=sizeof(array)/sizeof(double)/nCols;
constexpr size_t derOrder=1;
typedef Eigen::Map<Eigen::Matrix<double,1,rowSize>,Eigen::Unaligned,Eigen::InnerStride<nCols> > Map;
typedef const Eigen::Spline<double,nCols-1> Spline;
constexpr size_t interpolOrder=3;
constexpr double& xStop=array[nCols*(rowSize-1)];
Spline spline=Eigen::SplineFitting<Spline>::Interpolate(Map(array+1),interpolOrder,Map(static_cast<double*>(array))/xStop);
typedef Eigen::AutoDiffScalar<Eigen::Matrix<double,1,2> > DerType;
DerType f(const DerType& x){
DerType ret;
auto y = spline.derivatives<1>(x.value()/xStop);
//*** Compilation is okay if previous line is substituted with:
// Eigen::Array<double,1,2> y; y << 1.0, 2.0;
ret.value() = y(0,0);
ret.derivatives() = x.derivatives()*y(0,0);
return ret;
}
int main() {
DerType x(1.0,DerType::DerType(1.0,1.0));
auto y = f(x);
std::cout << "\nValue=" << y.value() << "\nDer=" << y.derivatives() << '\n';
return 0;
}
/*
Local Variables:
compile-command: "g++ -g -std=c++11 -I/usr/local/include/eigen3 eigenInterpolAD.cc -o a.exe && (echo \"Running\"; ./a.exe);"
End:
*/
令人沮丧的是,代码的编译给出了以下错误信息:
g++ -g -std=c++11 -I/usr/local/include/eigen3 eigenInterpolAD.cc -o a.exe && (echo "Running"; ./a.exe);
In file included from /usr/local/include/eigen3/Eigen/Core:254:0,
from /usr/local/include/eigen3/Eigen/Dense:1,
from /usr/local/include/eigen3/Eigen/Eigen:1,
from eigenInterpolAD.cc:5:
/usr/local/include/eigen3/Eigen/src/Core/PlainObjectBase.h: In instantiation of ‘static void Eigen::PlainObjectBase<Derived>::_check_template_params() [with Derived = Eigen::Array<double, 1, -1, 0, 1, 2>]’:
/usr/local/include/eigen3/Eigen/src/Core/Array.h:195:36: required from ‘Eigen::Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::Array(const Eigen::Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>&) [with _Scalar = double; int _Rows = 1; int _Cols = -1; int _Options = 0; int _MaxRows = 1; int _MaxCols = 2]’
eigenInterpolAD.cc:33:48: required from here
/usr/local/include/eigen3/Eigen/src/Core/util/StaticAssert.h:32:40: error: static assertion failed: INVALID_MATRIX_TEMPLATE_PARAMETERS
#define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG);
^
/usr/local/include/eigen3/Eigen/src/Core/PlainObjectBase.h:657:7: note: in expansion of macro ‘EIGEN_STATIC_ASSERT’
EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, (Options&RowMajor)==RowMajor)
^
我怎样才能避免这个错误?提前感谢您提供的任何有用提示。
本征版本是3.2。1.Eigen版本3.1和3.0的编译也失败。
编译器版本为:
gcc 4.8版。1(Ubuntu/Linaro 4.8.1-10ubuntu9)
正如用户Anycorn在“旧问题”一节中指出的,源代码使用最新版本的Bitbucket上的Eigen编译和运行:
$hg showconfig
bundle.mainreporoot=/usr/local/eigen
paths.default=https://bitbucket.org/eigen/eigen
/usr/local/eigen
$hg identify
fabd880592ac tip
/usr/local/eigen
我用下面的代码测试了这个原理:
/**
Spline interpolation with AD.
*/
#include <iostream>
#include <fstream>
#include <Eigen/Eigen>
#include <unsupported/Eigen/AutoDiff>
#include <unsupported/Eigen/Splines>
constexpr const double array[] = {
1.0, 2.0,
3.0, 4.0,
5.0, 1.0,
6.0, 2.0
};
constexpr size_t nCols=2;
constexpr size_t rowSize=sizeof(array)/sizeof(double)/nCols;
constexpr size_t derOrder=1;
typedef Eigen::Map<Eigen::Matrix<double,1,rowSize>,Eigen::Unaligned,Eigen::InnerStride<nCols> > Map;
typedef Eigen::Spline<double,nCols-1> Spline;
constexpr size_t interpolOrder=3;
constexpr double xStart=array[0];
constexpr double xStop=array[nCols*(rowSize-1)];
constexpr double xDelta=xStop-xStart;
const Spline spline=Eigen::SplineFitting<Spline>::Interpolate(Map(
const_cast<double*>(array)+1),
interpolOrder,
(Map(const_cast<double*>(array)).array()-xStart)/xDelta);
typedef Eigen::AutoDiffScalar<Eigen::Matrix<double,1,2> > DerType;
DerType f(const DerType& x){
DerType ret;
auto y = spline.derivatives<1>((x.value()-xStart)/xDelta);
ret.value() = y(0,0);
ret.derivatives() = x.derivatives()*y(0,1)/xDelta;
return ret;
}
int main() {
std::ofstream of("/temp/test.dat");
constexpr size_t n=101;
const double xStart=0.0;
const double xStop=6.0;
const double dx=(xStop-xStart)/(n-1);
double x=xStart;
for(size_t i=0; i!=n; i++, x+=dx) {
DerType xAD(x,DerType::DerType(1.0,1.0));
auto yAD = f(xAD);
of << x << ' ' << yAD.value() << ' ' << yAD.derivatives()[0] << '\n';
}
of.close();
return 0;
}
/*
Local Variables:
compile-command: "g++ -g -std=c++11 -I/usr/local/include/eigen3 eigenInterpolAD.cc -o a.exe && (echo \"Running\"; ./a.exe);"
End:
*/
下面生成的数据图显示,该代码现在可以很好地使用hg版本的Eigen。红色曲线是插值样条曲线,绿色曲线是其导数。
Eigen 是一个线性算术的C++模板库,包括:vectors, matrices, 以及相关算法。功能强大、快速、优雅以及支持多平台。 示例代码: #include <iostream>#include <Eigen/Dense>using namespace Eigen;int main(){Matrix2d a;a << 1, 2,3, 4;MatrixXd b(2,2);b << 2, 3
当两个向量求和时,我使用auto和
为牛顿方法编写实现雅可比矩阵的函数时,我注意到了一个非常严重的错误。 调用函数 仅返回,省略了的减法运算。但是如果我把代码改成 一切工作无缝。 我试图重现它,这不是完全相同的行为,但它也没有表现为想要的: 考虑下面的代码: 它会打印出来 到控制台。 但是,如果我更改为函数 控制台会打印 对于第二个矩阵。(这只是内存中一些未初始化的垃圾)。 有人能解释一下我的代码和示例问题发生了什么吗?我真的不知道
受这个答案的启发,我生成了这段代码,其输出取决于编译器: 如果使用 GCC 11 编译,调用
本文向大家介绍C++ Eigen库计算矩阵特征值及特征向量,包括了C++ Eigen库计算矩阵特征值及特征向量的使用技巧和注意事项,需要的朋友参考一下 本文主要讲解利用Eigen库计算矩阵的特征值及特征向量并与Matlab计算结果进行比较。 C++Eigen库代码 计算结果: 最大最小特征值及其索引位置 Matlab 代码 Matlab计算结果 使用sort()函数对特征值排序 主成份分析以及许多
我的angular 2组件有以下模板,但它抛出了一个模板解析错误。 这是错误消息-我的