- 浏览: 691135 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (181)
- Matlab (16)
- Java (26)
- autoHotkey (4)
- openCV (1)
- C++ (50)
- PDF-XChange Viewer (2)
- 学术 (11)
- javascript (4)
- linux (11)
- SWT (9)
- latex (7)
- GAE (2)
- windows (6)
- C# (3)
- PS (20)
- JNI (4)
- latex,批处理 (0)
- 批处理 (4)
- Android (5)
- 矩阵论 (1)
- SVM (1)
- 概率图模型 (0)
- Python (12)
- Eigen (5)
- 编程题 (1)
- MKL (1)
- 神经网络 (9)
- 最优化 (2)
- 摄影 (1)
- PPT (0)
- After Effects (3)
- CUDA (3)
- caffe (0)
- MXNet (2)
- svn (1)
- R (0)
- 虚拟机 (0)
- tensorflow (7)
- theano (1)
- Keras (1)
- vim (1)
- xgboost (1)
- spark (6)
- eclipse (2)
- word2vec (0)
- hadoop (1)
- dmlc (1)
- git (0)
最新评论
-
jeffersonz:
请问大神,这个插件记录下来的脚本为什么不能再Extendscr ...
PhotoShop - 记录PS的所有操作为JavaScript代码 -
cherishLC:
Andy__Zou 写道cherishLC 写道Andy__Z ...
Eigen的编译选项;MKL的使用 -
Andy__Zou:
cherishLC 写道Andy__Zou 写道cherish ...
Eigen的编译选项;MKL的使用 -
cherishLC:
Andy__Zou 写道cherishLC 写道Andy__Z ...
Eigen的编译选项;MKL的使用 -
Andy__Zou:
cherishLC 写道Andy__Zou 写道 您好,您的工 ...
Eigen的编译选项;MKL的使用
在使用Eigen编程时,到处是Curiously recurring template pattern,那么,我们如何知道一个矩阵中存的是double型变量还是float型的变量呢?
有人会说, MatrixXd中存的就是double型变量MatrixXf中存的是float型变量啊!
我是无耻的插队者:不了解Curiously recurring template pattern的可以看我之前的文章:http://cherishlc.iteye.com/blog/1994276
可是,如果一个泛型函数是如下定义的,我们如何知道X中存的是什么类型的变量呢?
先说一下这样写的好处:
但是,事物都有其两面性。。。
问题来了:如果再写函数的过程中,我们需要声明一个临时变量,与X中存储的元素类型相同,该如何声明?
答案很简单,Eigen在MatrixBase类(事实上是近乎所有类)中为我们定义了这些类型,
类型列表如下:
使用的时候,用如下语句可以声明一个变量s:
好了,最后来膜拜一下PlainObject的定义:
还有些简单的:
可能有些人还会有疑问,为何是internal::traits<Derived>::Scalar 而不是Derived::Scalar(事实上我们用的时候可以这么用,但是在写Eigen库的过程中不行)!!原因是在编写Eigen库的过程中,类型相互引用,会产生类型未定义的问题(大致如此,描述可能不准确),这样的问题,我们作为库的使用者是不会遇到的
摘录Eigen官方文档如下:
Matrix类官方文档:
http://eigen.tuxfamily.org/dox/classEigen_1_1Matrix.html
MatrixBase类官方文档:
http://eigen.tuxfamily.org/dox/classEigen_1_1MatrixBase.html#ac33495a0e3788e5951670c392b44d9ad
编写Eigen的泛型函数:
http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html
关于internal::traits的,这篇对理解Eigen架构很有帮助:
http://eigen.tuxfamily.org/dox/TopicInsideEigenExample.html
有人会说, MatrixXd中存的就是double型变量MatrixXf中存的是float型变量啊!
我是无耻的插队者:不了解Curiously recurring template pattern的可以看我之前的文章:http://cherishlc.iteye.com/blog/1994276
可是,如果一个泛型函数是如下定义的,我们如何知道X中存的是什么类型的变量呢?
template <typename Derived> void cov(const MatrixBase<Derived>& X){}
先说一下这样写的好处:
- 1、通用性强,X既可以是MatrixXd类型的,也可以是MatrixXf类型的,甚至是矩阵的一个子块m1.block(0,0,10,10)的 或者表达式 m1+m2 (假设m1,m2为MatrixXd类型的)
- 2、速度快(表达式类型不用先进行运算,存为Matrix了)
但是,事物都有其两面性。。。
问题来了:如果再写函数的过程中,我们需要声明一个临时变量,与X中存储的元素类型相同,该如何声明?
答案很简单,Eigen在MatrixBase类(事实上是近乎所有类)中为我们定义了这些类型,
类型列表如下:
- Scalar: 矩阵中存储的类型
- Index: 矩阵下标的类型,貌似为unsigned int型的
- PlainObject: 表达式对应的矩阵类型, 比如m1+m2对应的PlainObject为 m1的类型,即decltype(m1)
使用的时候,用如下语句可以声明一个变量s:
typename Derived::Scalar s;
好了,最后来膜拜一下PlainObject的定义:
typedef Matrix<typename internal::traits<Derived>::Scalar, internal::traits<Derived>::RowsAtCompileTime, internal::traits<Derived>::ColsAtCompileTime, AutoAlign | (internal::traits<Derived>::Flags&RowMajorBit ? RowMajor : ColMajor), internal::traits<Derived>::MaxRowsAtCompileTime, internal::traits<Derived>::MaxColsAtCompileTime > PlainObject
还有些简单的:
typedef typename internal::traits<Derived>::Index Index; typedef typename internal::traits<Derived>::Scalar Scalar; typedef typename NumTraits<Scalar>::Real RealScalar;
可能有些人还会有疑问,为何是internal::traits<Derived>::Scalar 而不是Derived::Scalar(事实上我们用的时候可以这么用,但是在写Eigen库的过程中不行)!!原因是在编写Eigen库的过程中,类型相互引用,会产生类型未定义的问题(大致如此,描述可能不准确),这样的问题,我们作为库的使用者是不会遇到的
摘录Eigen官方文档如下:
引用
Let us now explain the internal::traits here. The internal::scalar_sum_op class takes one template parameter: the type of the numbers to handle. Here of course we want to pass the scalar type (a.k.a. numeric type) of VectorXf, which is float. How do we determine which is the scalar type of Derived ? Throughout Eigen, all matrix and expression types define a typedef Scalar which gives its scalar type. For example, VectorXf::Scalar is a typedef for float. So here, if life was easy, we could find the numeric type of Derived as just
typename Derived::Scalar
Unfortunately, we can't do that here, as the compiler would complain that the type Derived hasn't yet been defined. So we use a workaround: in src/Core/util/ForwardDeclarations.h, we declared (not defined!) all our subclasses, like Matrix, and we also declared the following class template:
template<typename T> struct internal::traits;
In src/Core/Matrix.h, right before the definition of class Matrix, we define a partial specialization of internal::traits for T=Matrix<any template parameters>. In this specialization of internal::traits, we define the Scalar typedef. So when we actually define Matrix, it is legal to refer to "typename internal::traits\<Matrix\>::Scalar".
typename Derived::Scalar
Unfortunately, we can't do that here, as the compiler would complain that the type Derived hasn't yet been defined. So we use a workaround: in src/Core/util/ForwardDeclarations.h, we declared (not defined!) all our subclasses, like Matrix, and we also declared the following class template:
template<typename T> struct internal::traits;
In src/Core/Matrix.h, right before the definition of class Matrix, we define a partial specialization of internal::traits for T=Matrix<any template parameters>. In this specialization of internal::traits, we define the Scalar typedef. So when we actually define Matrix, it is legal to refer to "typename internal::traits\<Matrix\>::Scalar".
Matrix类官方文档:
http://eigen.tuxfamily.org/dox/classEigen_1_1Matrix.html
MatrixBase类官方文档:
http://eigen.tuxfamily.org/dox/classEigen_1_1MatrixBase.html#ac33495a0e3788e5951670c392b44d9ad
编写Eigen的泛型函数:
http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html
关于internal::traits的,这篇对理解Eigen架构很有帮助:
http://eigen.tuxfamily.org/dox/TopicInsideEigenExample.html
发表评论
-
C++函数中的静态变量
2019-07-19 11:22 816在C++中,可以在成员函数中使用静态变量,从而间接达到在hpp ... -
tensorflow 静态编译笔记 -- linux系统
2018-11-05 14:26 0注: 1、编译tensorflow静态库 很简单,参见: h ... -
gperftools笔记
2018-06-27 14:30 0export LD_LIBRARY_PATH=LD_LIBR ... -
dmlc分布式线性模型编译笔记
2018-06-06 10:37 21711、使用第三方修改后的wormhole工程 原始工程wor ... -
C++中读取控制台输出,并将文件指针FILE*转换为istream
2017-11-27 15:03 1815解决的问题: 1、通过执行系统的bash命令后,获取其输出( ... -
c++中使用boost库在共享内存中存储map
2017-11-09 11:37 5405boost库中的interprocess包可以在共享内存中创建 ... -
近似最近邻算法库FLANN
2017-04-25 18:45 0FLANN库是计算近似最近邻的库, 问题定义如下: 给定距离函 ... -
C++杂记-- 重定向std::cout等
2017-04-18 17:28 19631、屏蔽std::cout 参见:http://stackov ... -
CMake指定目标代码的平台(win32,x64)
2016-06-03 20:54 11716主要参考自:http://blog.c ... -
windows 10下安装GPU版MXNet
2016-06-03 21:28 8586上回说到编译CPU版的MXNet: http://cheris ... -
windows下安装CPU版mxnet
2016-05-23 23:14 17582MXnet (mix net)类似Caffe,Tensorfl ... -
Linux C++编译及 静态/动态 链接库 笔记
2015-12-20 19:49 60521、C++文件的编译 g++参 ... -
Linux (Ubuntu) 下 Eclipse C++ 环境配置
2015-12-08 21:49 19571、安装JDK 参见http://blog.csdn.net/ ... -
Photoshop插件开发-filter
2015-10-11 22:53 3371初学,,感觉PS插件的文档很烂,,教程也很少,,也就这么简单学 ... -
使Visual Assist X支持CUDA的.cu文件的代码提示
2015-07-17 00:05 2301现在安装CUDA很方便了,直接支持Visual Studio。 ... -
CUDA程序block和thread超出硬件允许值时的异常
2015-07-13 11:32 3749调用CUDA的核函数时指定block 和 thread大小,该 ... -
创建及使用DLL
2014-09-29 15:22 1232此篇仅作简要的记录,作为备忘。 更为详细的可以参考:http: ... -
matlab的mexFunction中使用std::cout(部分转载)
2014-09-27 15:37 2161在matlab、C++混合编程的时候,可能会用到之前的代码。代 ... -
Eigen库:那些年我们一起经历的bug
2014-09-24 18:39 18561、使用auto声明新变量 ... -
C++:无虚函数的类作为有虚函数类的父类时产生Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
2014-09-24 09:48 1994调程序时忘了为啥,写了一小段测试程序,再简单不过,结果跑出了E ...
相关推荐
此外,为了优化性能,你可以通过定义`#define EIGEN_USE_MKL_ALL`来利用Intel的MKL数学库,这样Eigen可以更好地与MKL配合,提升矩阵运算速度。 在Eigen中,矩阵的下标是从0开始的,遵循C++的数组访问规则。默认情况...
本文详细介绍了Eigen和Dlib两个C++库的功能和基本操作方法,包括Eigen库的安装、基本矩阵运算、特征值和特征向量计算、矩阵分解等内容,以及Dlib库的安装、图像加载处理、特征提取、人脸检测、支持向量机分类和神经...
本文主要介绍了Eigen库的基本概念和使用方法,包括如何包含头文件、定义不同类型的矩阵、初始化矩阵、获取矩阵信息、矩阵和数组之间的转换以及调整矩阵大小等。通过学习这些基础知识,可以帮助开发人员快速上手并...
在Eigen中,我们可以定义固定大小的矩阵和向量,如Matrix3d代表一个3x3的双精度浮点矩阵,而MatrixXd则是一个动态大小的双精度浮点矩阵。 对于矩阵和向量的维度操作,Eigen提供了不同的模板参数来指定行和列的大小...
Eigen是一个开源的C++矩阵和向量库,专为数值计算而设计,它在C++环境中提供了高效、灵活且易于使用的线性代数操作。Eigen库适用于各种应用场景,包括机器学习、图像处理、物理模拟等,其核心特性包括模板类、自动...
Eigen库提供了多种矩阵和向量类型,如`MatrixXd`用于双精度浮点数的矩阵,`MatrixXcd`用于复数矩阵,`MatrixXf`用于单精度浮点数的矩阵,以及`MatrixXi`用于整数矩阵。向量类型有`VectorXd`、`VectorXcd`、`VectorXf...
2. **命名空间**:Eigen库的函数和类定义在`Eigen`命名空间中,所以在使用它们之前,需要通过`using namespace Eigen;`来引入这个命名空间,以便于直接调用其成员。 3. **矩阵和向量的创建**:Eigen支持不同类型的...
Eigen库是C++中用于线性代数计算的一个高效、灵活且易于使用的开源库。它提供了丰富的接口,支持向量、矩阵以及更复杂的线性运算。这篇内容将深入探讨Eigen库的基本概念、主要接口和如何进行单元测试。 一、Eigen库...
EigenC++是一个高效且灵活的开源C++矩阵和向量库,主要用于进行数值计算,尤其在处理线性代数问题时表现出色。它提供了一套直观的API,使得程序员能够轻松地进行矩阵运算,如矩阵乘法、求逆、特征值、解线性方程组等...
1. 数据结构:MATLAB中的向量和矩阵在C++中可以使用Eigen库来实现。Eigen是一个轻量级、高效的C++模板库,提供了类似于MATLAB的矩阵和向量操作。在C++中,我们需要定义Eigen::Matrix类来存储和操作数据。 2. 矩阵...
"伟根"可能是“韦根”的误写,这里指的是Weigen库,可能是一个针对STM32进行数学计算优化的库,尤其是矩阵运算,因为通常在C++中,Eigen库是用来处理高效矩阵和向量操作的。描述中的"26/34"可能是指数据总线宽度,如...
在C++编程中,我们需要定义卡尔曼滤波器的结构体或类,包括状态向量、系统矩阵、观测矩阵、噪声协方差矩阵等关键元素。例如: ```cpp struct KalmanFilter { Eigen::VectorXd state; Eigen::MatrixXd transition...
- `MatrixXd`:Eigen库中的矩阵类型,用于存储数值数据。 - `static MatrixXd Y_ref = MatrixXd::Zero(P, 1);`:参考信号矩阵。 - `static MatrixXd Y_cor = MatrixXd::Zero(P, 1);`:校正后的参考信号矩阵。 - `...
在本文中,我们将深入探讨C++编程语言中用于计算矩阵奇异值分解(Singular Value Decomposition, SVD)的方法,并特别关注"pinv",它指的是矩阵的广义逆(pseudoinverse)。奇异值分解是线性代数中的一个核心概念,...
在C++中实现GN算法,你需要用到一些数值库,比如Eigen库来处理矩阵运算。首先,你需要定义目标函数和雅可比矩阵的计算方法,然后在每次迭代中进行相应的计算。同时,为了提高效率和避免除以零的错误,可能需要使用...
在C++中,我们可以使用Eigen库来处理矩阵运算和求逆。首先,确保安装了Eigen库,然后可以按照以下步骤编写代码: ```cpp #include <Eigen/Dense> // 定义设计矩阵X和观测值向量y Eigen::MatrixXd X(data_size, m+...
3. **求解线性方程组**:利用C++中的线性代数库,如Eigen,求解这个线性方程组。这将得到每一段三次多项式的系数。 ```cpp Eigen::MatrixXd buildTridiagonalMatrix(const std::vector<Point>& points); Eigen::...
在这个例子中,我们首先定义了`normalizeData`函数来标准化数据,然后`covarianceMatrix`函数计算协方差矩阵。在`pcaImplementation`函数中,我们进行特征值分解并打印出特征值和对应的特征向量。在`main`函数中,...
errorCovariance = (Eigen::MatrixXd::Identity(state.rows(), state.cols()) - K * H) * errorCovariance; } ``` 这里的`A`, `B`, `Q`, `H`, `R`分别代表系统矩阵、控制输入矩阵、过程噪声协方差、观测矩阵和测量...
在C++中,我们可以利用标准模板库(STL)和一些线性代数库(如Eigen库)来实现这个过程。以下是一个简单的C++程序示例,展示了如何进行最小二乘法线性拟合: ```cpp #include #include #include #include <Eigen/...