同型矩阵运算满足加法交换律、结合律;并存在单位元、逆元、和0元,为同型矩阵对加法的交换环。

Eigen的简单运算参考:http://blog.163.com/jiaqiang_wang/blog/static/1188961532013625102721873/

一、For Eigen

1.零初始化、单位阵、全1矩阵

//初始化状态向量和状态协方差
int initialize_x_and_p(Eigen::MatrixXf &x_k_k,Eigen::MatrixXf &p_k_k)
{ //Initial velocity values
float v_0 = 0;
float std_v_0 = 0.025;
float w_0 = 1e-15;
float std_w_0 = 0.025; // Initial state vector and covariance matrix
x_k_k = Eigen::MatrixXf::Zero(1,13) ;
x_k_k<<0,0,0,1,0,0,0,v_0,v_0,v_0,w_0,w_0,w_0; p_k_k= Eigen::MatrixXf::Zero(13,13); //eps为MATLAB的最小精度;eps是浮点相对误差限,是指计算机用于区分两个数的差的最小常数
//最小精度eps(N)随着数量级增大,eps也在逐渐增大
p_k_k(1,1)=eps;
p_k_k(2,2)=eps;
p_k_k(3,3)=eps;
p_k_k(4,4)=eps;
p_k_k(5,5)=eps;
p_k_k(6,6)=eps;
p_k_k(7,7)=eps; p_k_k(8,8) =std_v_0 * std_v_0;
p_k_k(9,9) =std_v_0 * std_v_0;
p_k_k(10,10) =std_v_0 * std_v_0; p_k_k(11,11) =std_w_0 * std_w_0;
p_k_k(12,12) =std_w_0 * std_w_0;
p_k_k(13,13) =std_w_0 * std_w_0; return 1;
}

2. 矩阵元的运算

size():获取矩阵的行数和列数

r=size(A,1)该语句返回的时矩阵A的行数, c=size(A,2) 该语句返回的时矩阵A的列数。

size( yi, 2 )  转译为 yi.cols()

3.随机矩阵生成

Matlab :   M= rand( 1, nPointsRand )-0.5;   //生成从0到1的nPointsRand个随机数,再减去0.5即:(-0.5,.0.5)

翻译为Eigen:

X=  Eigen::MatrixXf::Random(1,nPointsRand)  //默认生成 1行 nPointsRand列,率属于(-0.5,.0.5)的随机数

4.矩阵复制及行列复制

	<pre name="code" class="cpp">	int nPointsRand = 12;
Eigen::MatrixXf X = Eigen::MatrixXf::Random(1,nPointsRand);
Eigen::MatrixXf Y = Eigen::MatrixXf::Random(1,nPointsRand);
Eigen::MatrixXf Z = Eigen::MatrixXf::Random(1,nPointsRand);
Eigen::MatrixXf theta = Eigen::MatrixXf::Random(1,nPointsRand);
Eigen::MatrixXf phi = Eigen::MatrixXf::Random(1,nPointsRand);
Eigen::MatrixXf lambda = Eigen::MatrixXf::Random(1,nPointsRand);
Eigen::MatrixXf randSphere6D =Eigen::MatrixXf (6,nPointsRand);//randSphere6D 是6*nPointsRandDouble! //以下两种赋值方法都可以
//randSphere6D(0)=X(0);
//randSphere6D(1)=Y(0);
//randSphere6D(2)=Z(0);
//randSphere6D(3)= theta(0);
//randSphere6D(4)= phi(0);
//randSphere6D(5)=lambda(0);
randSphere6D<< X,Y,Z,theta,phi,lambda; //释放6个矩阵!
X.resize(0,0);Y.resize(0,0);Z.resize(0,0);theta.resize(0,0);phi.resize(0,0);lambda.resize(0,0);



5.四舍五入、ceil、floor

Matlab: round 

6.三角函数

atan2(X,Y)的含义和atan(X/Y)的含义是一样的。就是求正切值 X/Y 对应的弧度值。

但ATAN2(a, b) 与 ATAN(a/b)值域稍有不同,ATAN2(a,b)的取值范围介于 -pi 到 pi 之间(不包括 -pi),而ATAN(a/b)的取值范围介于-pi/2到pi/2之间(不包括±pi/2)。

atan2( hrl( 1, : ), hrl( 3, : ) )

翻译为Eigen://wishchin!

atan(  hrl.row( 1)*hrl.row( 3)/(hrl.row(1).norm()*hrl.row( 3).norm() )   )

7.数组运算符,只是在矩阵运算符前面增加一点“.”来表示

SNIP........................

8.矩阵整体运算

matlab  inv(M)

翻译为:

Eigen: M.Array().inverse()// 值得注意的是:不能达到矩阵逆的实现
Eigen: M.inverse() //此函数可以实现,但有时会失效,这是为何?

注意事项:

<pre name="code" class="cpp">#include <Eigen/Dense>

Eigen: M.inverse()        //包含此头文件才能实现矩阵求逆。


9.多维重排

函数功能:在MATLABFreeMat中,该函数按指定的向量来重新排列一个数组
语法格式:
         B = permute(A, order) ;
按照向量order指定的顺序重排A的各维。B中元素和A中元素完全相同。

但由于经过重新排列,在A、B访问同一个元素使用的下标就不一样了。order中的元素必须各不相同。

10.矩阵块的获取

Eigen: P.block(i, j, rows, cols)
Matlab: P(i+1 : i+rows, j+1 : j+cols)

实例:

Eigen::MatrixXf  P_xv(13,13); //= P( 1:13, 1:13 );
P_xv=P.block(0,0,13,13);
Eigen::MatrixXf P_yxv = P.block(13,0,P.rows()-13,13 );// P( 14:end, 1:13 );
Eigen::MatrixXf P_y = P.block(13,13,P.rows()-13,P.cols()-13 );//P( 14:end, 14:end );
Eigen::MatrixXf P_xvy = P.block(0,13,P.rows()-13,P.cols()-13 );//P( 1:13, 14:end );

11.关于Matlab reshape



B = reshape(A,m,n)
返回一个m*n的矩阵B, B中元素是按列从A中得到的。如果A中元素个数没有m*n个, 则会引发错误。

引用方法:列优先,逐个复制 到新的矩阵.......

12.Matlab dot(A,B)和cross(A,B)

MATLAB中 dot(x, y)和cross(x, y)是向量内积和外积

Matlab:

    cross(x,y)

Eigen:

    x.cross(y)

Eigen还提供了dot()点乘函数和cross()叉乘函数。其中dot可以针对任意两个长度相等的向量,而叉乘只能是两个三维向量,例如Vector3d v(1, 2, 3); Vector3d w(0, 1, 2); 那么v.dot(w) 得到的结果是8(等价于v.adjoint() * w),v.corss(w)得到的结果是(1;-2;1)。

13.对于这种形式:X_km1_k = [ Xv_km1_k; X_k( 14:end,: ) ];

直接对新矩阵进行添加...

14.Matlab sparse

Matlab里面有两个非常有用函数:randperm()与sparse()。

randperm(n)会返回一个1维数组(向量),该数组是整数1到n的一组随机排列,彼此无重复,顺序随机。

sparse(X)会返回一个矩阵X的稀疏矩阵的表达形式。在Matlab的Workspace中,稀疏矩阵的图标是,不同于一般的结构体、矩阵等。

15.Matlab eig函数

Matlab里面的eig(M)函数给出了求特征值的方法:

        M = eig(S);

翻译成Eigen为:

	Eigen::MatrixXf S = features_info[i_feature].S;
Eigen::SelfAdjointEigenSolver<Eigen::MatrixXf> eigensolver(S);
Eigen::MatrixXf E = eigensolver.eigenvalues()



16.相关系数 corrcoef


Matlab相关系数的意义:

Eigen::MatrixXf  correlation_matrix = corrcoef( LocM );

对行向量求相关系数 , 与列数无关,返回 cols()*cols() 矩阵...

翻译成Eigen:

还是自己写个函数吧
//1.求协方差

Eigen::MatrixXf CIcSearchM::cov(Eigen::MatrixXf &d1, Eigen::MatrixXf &d2)
{
    Eigen::MatrixXf  CovM(1,1);
    assert(1 ==d1.cols() && 1 ==d2.cols() &&d1.cols()==d2.cols()  );     //求协方差
    float Ex =0;float Ey=0;
    for (int i=0;i< d1.rows();++i){
        Ex +=d1(i);
        Ey +=d2(i);
    }
    Ex /=d1.rows();
    Ey /=d2.rows();     for (int i=0;i< d1.rows();++i){
        CovM(0) += (d1(i)-Ex)*(d2(i)-Ey);
    }
    CovM(0) /= d1.rows() -1;
    return CovM;
}

//2.写入方差矩阵

//求矩阵的相关系数!
//返回矩阵A的列向量的相关系数矩阵//对行向量求相关系数 , 与行数无关,返回 cols()*cols() 矩阵...
Eigen::MatrixXf CIcSearchM::corrcoef(Eigen::MatrixXf &M)
{
// C(i,j)/SQRT(C(i,i)*C(j,j)).//C is the covariation Matrix
int Row= M.rows();
int Col= M.cols();
int Order= Col;//int Order= (std::max)(Row,Col); Eigen::MatrixXf Coef(Order,Order);
for (int i=0;i<Order;++i){
for (int j=0;j<Order;++j){
Coef(i,j)= cov((Eigen::MatrixXf)M.col(i),(Eigen::MatrixXf)M.col(j))(0);
}
}
return Coef;
}

17.Matlab logical函数

Matlab logical:把非0元素转化为整数/bool型数1

M =
0.4300 -0.0300 -0.0400 -0.1600 -0.2500 -0.6500 -0.6700
-0.0300 0.0400 0.1600 0.2500 0.6500 0.6700 0.2500 >> x =logical(M)
x =
1 1 1 1 1 1 1
1 1 1 1 1 1 1 >> M(2,2)=0
M =
0.4300 -0.0300 -0.0400 -0.1600 -0.2500 -0.6500 -0.6700
-0.0300 0 0.1600 0.2500 0.6500 0.6700 0.2500
<pre name="code" class="cpp">>> x =logical(M)
x =
1 1 1 1 1 1 1
1 0 1 1 1 1 1

转化为Eigen:

//代替Matlab的逻辑转换函数!把非0值转换为1,0值为0!
Eigen::MatrixXf CRansHyper::logical(Eigen::MatrixXf &M)
{
Eigen::MatrixXf MD(M.rows(),M.cols());
for (int i=0;i<M.rows();++i)
{
for (int j=0;j< M.cols();++j)
{
if (M(i,j)!=0 ){
MD(i,j) =1;
}
else
MD(i,j) =0;
}
}
return MD;
}

18.Matlab repmat函数

repmat 重复填充一个小矩阵形成一个大矩阵

>> M=[45,6,6;6,7,8]
M =
45 6 6
6 7 8 >> N =repmat(M,2,3)
N =
45 6 6 45 6 6 45 6 6
6 7 8 6 7 8 6 7 8
45 6 6 45 6 6 45 6 6
6 7 8 6 7 8 6 7 8

释义:把矩阵M(2,3)以两行三列的形式填充成大矩阵N(4,9)

转换成Eigen:

//用小矩阵填充成大矩阵!wishchin!!
Eigen::MatrixXf CRansHyper::repmat(Eigen::MatrixXf &M,int rowM,int colM)
{
Eigen::MatrixXf MD(rowM*M.rows(), colM*M.cols() ); for (int i=0;i< rowM;++i){
for (int j=0;j< colM;++j){ for (int m=0;m< M.rows();++m){
for (int n=0;n<M.cols();++n){
MD(i*M.rows()+m, j*M.cols()+n)= M(m,n);
}
}
}
} return MD;
}

19.Matlab 三角函数

matlab三角函数对数组求值相当于对每一个元素求值再填入矩阵

K>> x=[5,34,5,6]
x =
5 34 5 6
K>> sin(x)
ans =
-0.9589 0.5291 -0.9589 -0.2794
K>> sin(5)
ans =
-0.9589



20.Matlab  find函数


matlab: 语法:

/* 找出矩阵X中的所有非零元素,并将这些元素的线性索引值(linear indices:按列)返回到向量ind中。

如果X是一个行向量,则ind是一个行向量;否则,ind是一个列向量。

如果X不含非零元素或是一个空矩阵,则ind是一个空矩阵。 */

ind = find(X)

 /* 返回第一个非零元素k的索引值。
k必须是一个正数,但是它可以是任何数字数值类型。 */
ind = find(X, k) /* 返回X中非零元素行索引值的向量*/ ind = find(X, k, 'first') /* 返回最后一个非零元素k的索引值。*/ ind = find(X, k, 'last') /* 返回矩阵X中非零元素的行和列的索引值。 这个语法对于处理稀疏矩阵尤其有用。 如果X是一个N(N>2)维矩阵,col包括列的线性索引。 例如,一个5*7*3的矩阵X,有一个非零元素X(4,2,3),find函数将返回row=4和col=16。也就是说,(第1页有7列)+(第2页有7列)+(第3页有2列)=16。*/ [row,col] = find(X, ...) /* 返回X中非零元素的一个列或行向量v,同时返回行和列的索引值。 如果X是一个逻辑表示,则v是一个逻辑矩阵。 输出向量v(稀疏矩阵)包含通过评估X表示得到的逻辑矩阵的非零元素。*/ [row,col,v] = find(X, ...)

改写其中的一个:

/* 找出矩阵X中的所有非零元素,并将这些元素的线性索引值(linear indices:按列)返回到向量中。
如果X是一个行向量,则ind是一个行向量;否则,ind是一个列向量。
如果X不含非零元素或是一个空矩阵,则ind是一个空矩阵。 */ //默认返回大于0的值//为X *1的矩阵,行优先!
Eigen::MatrixXf CEkfSlam::find(Eigen::MatrixXf &M)
{
assert(1 == M.rows() ); int counter =0;
//返回数组中大于value的下标,返回索引
//使用Push太慢了,还是遍历两次吧
for (int i =0;i< M.cols();++i)
{
if (M(i)> 1)
{
++counter;
}
} Eigen::MatrixXf index(counter,1);
counter=0;
for (int i =0;i< M.cols();++i)
{
if (M(i)> 1)
{
M(counter) =counter;
++counter;
}
}
return index;
}

二、For  OpenCV—Mat

1. 三角函数

atan2(X,Y)的含义和atan(X/Y)的含义是一样的。就是求正切值 X/Y 对应的弧度值。

但ATAN2(a, b) 与 ATAN(a/b)值域稍有不同,ATAN2(a,b)的取值范围介于 -pi 到 pi 之间(不包括 -pi),而ATAN(a/b)的取值范围介于-pi/2到pi/2之间(不包括±pi/2)。

atan2( hrl( 1, : ), hrl( 3, : ) )


2.图像块获取

Matlab可以直接使用:和索引获取矩阵块,

翻译成OpenCV:

//使用OpenCV getRect函数 //GetRectSubPix 从图像中提取象素矩形,使用子象素精度
std::vector<CvPoint> cs(0);
cv::Mat RectImg;
const double Thres =100;
CvSize Rect;
Rect.height=initializing_box_semisize.height;
Rect.width =initializing_box_semisize.width ;
cv::getRectSubPix(im_k,Rect,search_region_center,RectImg,-1);

3.Matlab到OpenCV Mat型的转化

OpenCV的Mat型提供了各种矩阵运算,其中一部分如下

    static Matx all(_Tp alpha);
static Matx zeros();
static Matx ones();
static Matx eye();
static Matx <span style="color:#FF0000;">diag</span>(const diag_type& d);
static Matx randu(_Tp a, _Tp b);
static Matx randn(_Tp a, _Tp b); //! dot product computed with the default precision
_Tp dot(const Matx<_Tp, m, n>& v) const; //! dot product computed in double-precision arithmetics
double ddot(const Matx<_Tp, m, n>& v) const; //! conversion to another data type
template<typename T2> operator Matx<T2, m, n>() const; //! change the matrix shape
template<int m1, int n1> Matx<_Tp, m1, n1> reshape</span>() const; //! extract part of the matrix
template<int m1, int n1> Matx<_Tp, m1, n1> get_minor(int i, int j) const; //! extract the matrix row
Matx<_Tp, 1, n> row(int i) const; //! extract the matrix column
Matx<_Tp, m, 1> col(int i) const; //! extract the matrix diagonal
diag_type diag() const; //! transpose the matrix
Matx<_Tp, n, m> t() const; //! invert matrix the matrix
Matx<_Tp, n, m> inv (int method=DECOMP_LU) const; //! solve linear system
template<int l> Matx<_Tp, n, l> solve(const Matx<_Tp, m, l>& rhs, int flags=DECOMP_LU) const;
Vec<_Tp, n> solve(const Vec<_Tp, m>& rhs, int method) const; //! multiply two matrices element-wise
Matx<_Tp, m, n> mul(const Matx<_Tp, m, n>& a) const; Vec cross(const Vec& v) const;

三、for C++

1.关于运算符重载

要把需要重载的运算符的函数体,写在CPP文件里。

2.生成随机数

Y = rand(n)
Y = rand(m,n)
Y = rand([m n])
Y = rand(m,n,p,...)
Y = rand([m n p...])
Y = rand(size(A))

rand

s = rand('state')

描述:

rand函数产生由在(0, 1)之间均匀分布的随机数组成的数组。

Y = rand(n) 返回一个n x n的随机矩阵。如果n不是数量,则返回错误信息。
Y = rand(m,n) 或 Y = rand([m n]) 返回一个m x n的随机矩阵。
Y = rand(m,n,p,...) 或 Y = rand([m n p...]) 产生随机数组。
Y = rand(size(A)) 返回一个和A有相同尺寸的随机矩阵。

翻译成C++:

    v1 = rand() % 100;         // v1 in the range 0 to 99
v2 = rand() % 100 + 1; // v2 in the range 1 to 100
v3 = rand() % 30 + 1985; // v3 in the range 1985-2014

3.Matlab meshgrid

对于数据:

uv_predSrc:

47.9999999999998    48.9999999999998    49.9999999999998    50.9999999999998    51.9999999999998    52.9999999999998    53.9999999999998   

为 1*7 的矩阵

经过转换:

[u_pred,v_pred]=meshgrid( uv_predSrc );

获取的结果为:

u_pred:

47.9999999999998	48.9999999999998	49.9999999999998	50.9999999999998	51.9999999999998	52.9999999999998	53.9999999999998
47.9999999999998 48.9999999999998 49.9999999999998 50.9999999999998 51.9999999999998 52.9999999999998 53.9999999999998
47.9999999999998 48.9999999999998 49.9999999999998 50.9999999999998 51.9999999999998 52.9999999999998 53.9999999999998
47.9999999999998 48.9999999999998 49.9999999999998 50.9999999999998 51.9999999999998 52.9999999999998 53.9999999999998
47.9999999999998 48.9999999999998 49.9999999999998 50.9999999999998 51.9999999999998 52.9999999999998 53.9999999999998
47.9999999999998 48.9999999999998 49.9999999999998 50.9999999999998 51.9999999999998 52.9999999999998 53.9999999999998
47.9999999999998 48.9999999999998 49.9999999999998 50.9999999999998 51.9999999999998 52.9999999999998 53.9999999999998

v_pred:

47.9999999999998	47.9999999999998	47.9999999999998	47.9999999999998	47.9999999999998	47.9999999999998	47.9999999999998
48.9999999999998 48.9999999999998 48.9999999999998 48.9999999999998 48.9999999999998 48.9999999999998 48.9999999999998
49.9999999999998 49.9999999999998 49.9999999999998 49.9999999999998 49.9999999999998 49.9999999999998 49.9999999999998
50.9999999999998 50.9999999999998 50.9999999999998 50.9999999999998 50.9999999999998 50.9999999999998 50.9999999999998
51.9999999999998 51.9999999999998 51.9999999999998 51.9999999999998 51.9999999999998 51.9999999999998 51.9999999999998
52.9999999999998 52.9999999999998 52.9999999999998 52.9999999999998 52.9999999999998 52.9999999999998 52.9999999999998
53.9999999999998 53.9999999999998 53.9999999999998 53.9999999999998 53.9999999999998 53.9999999999998 53.9999999999998

程序功能为:

把一系列下标转化为两个下标方阵,前一个为行复制,后一个为列复制。

转换为C++写一个循环就可以了.

//返回两个行列方阵矩阵
double CIcSearchM::meshgrid(
Eigen::MatrixXf &MSrc,Eigen::MatrixXf &MU,Eigen::MatrixXf &MV)
{
Eigen::MatrixXf MSrcCol(MSrc.rows() ,1);
for (int i =0;i< MSrc.rows();++i)
{
MSrcCol(i) = MSrc(i);
} MU.resize( MSrc.rows(), MSrc.rows() );
MV.resize( MSrc.rows(), MSrc.rows() ); for (int i=0;i< MSrc.rows();++i)
{
MU.row(i) = MSrc.row(0);
MV.col(i) = MSrcCol.col(0);
} return 1;
}


4.Matlab interp2

四、for  OpenGL

1.画出射线


Matlab:

function vectarrow(p0,p1,color)
  if max(size(p0))==3
      if max(size(p1))==3
          x0 = p0(1);
          y0 = p0(2);
          z0 = p0(3);
          x1 = p1(1);
          y1 = p1(2);
          z1 = p1(3);
          plot3([x0;x1],[y0;y1],[z0;z1],'color',color);   % Draw a line between p0 and p1

画出从p0到p1的射线

转换为OpenGL:

一大堆代码:

</pre><pre name="code" class="cpp">this->vectArrow(PointS,PointE,ColorType);

int CPlot::vectArrow(
Eigen::MatrixXf &PointS, Eigen::MatrixXf &PointE,std::string type)
{
Eigen::MatrixXf EndPoints(6,1);
EndPoints<<
PointS(0),PointS(1),PointS(2),
PointE(0),PointE(1),PointE(2); this->openglViewer->GetVectorPoint(EndPoints);// return 1;
} drawTransAxis(this->m_PointSeries);
int OpenGLViewer::GetVectorPoint(Eigen::MatrixXf &endPoints)
{
Eigen::MatrixXf NewEndPoint= endPoints;
this->m_PointSeries.push_back( NewEndPoint);
return 1;
} void OpenGLViewer::paintGL(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
this->drawWorldAxis();
this->drawTransAxis(this->m_PointSeries);
this->drawTriangle(this->m_TriangleSeries);
this->drawCloud();
}
void OpenGLViewer::drawTransAxis(std::vector<Eigen::MatrixXf> &PointSeries)
{ GLfloat x = GLfloat(640) / 480;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(-2.0 , 6.0, -4.0, 0.0 , 0.0 , 0.0 , 0.0, 1.0 , 0.0); float len = 0.2; glTranslatef(transX,transY,-transZ);
glRotatef(rotationX , 1.0,0.0,0.0);
glRotatef(rotationY , 0.0,1.0,0.0);
glRotatef(rotationZ , 0.0,0.0,1.0);
glScalef(xscale, yscale, zscale); //The Cube aixs / coordinate system!
//1. The axis line!
glColor3f(1.0f,1.0f,1.0f);
glBegin(GL_LINES);
glVertex3f(-1.9f,00.0f,0.0f);
glVertex3f(1.9f,0.0f,0.0f);
glVertex3f(0.0f,-1.9f,0.0f);
glVertex3f(0.0f,1.9f,0.0f);
glVertex3f(0.0f,0.0f,-1.9f);
glVertex3f(0.0f,0.0f,1.9f); //画出多个线段
for (int i=0;i< PointSeries.size();++i)
{
glVertex3f(PointSeries[i](0),PointSeries[i](1),PointSeries[i](2) );
glVertex3f(PointSeries[i](3),PointSeries[i](4),PointSeries[i](5) );
}
glEnd(); //The Cube aixs / coordinate system!
//2. The axis arrow!
glColor3f(1.0f,0.0f,0.0f); //x arrow
glPushMatrix();
glTranslatef(1.2f,0.0f,0.0f);
glRotatef(90.0f,0.0f,1.0f,0.0f);
glutSolidCone(0.05,0.15,10,10);
glPopMatrix(); glColor3f(0.0f,1.0f,0.0f); // y
glPushMatrix();
glTranslatef(0.0f,1.2f,0.0f);
glRotatef(-90.0f,1.0f,0.0f,0.0f);
glutSolidCone(0.05,0.15,10,10);
glPopMatrix(); glColor3f(0.0f,0.0f,1.0f); // z
glPushMatrix();
glTranslatef(0.0f,0.0f,1.2f);
glRotatef(90.0f,0.0f,0.0f,1.0f);
glutSolidCone(0.05,0.15,10,10);
glPopMatrix(); glFlush();
}

五、常见错误集合

1. 错误    52    error C2338: THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZE    c:\tools\eigen\include\eigen\src\core\matrix.h    265

引发错误的代码段:

Eigen::MatrixXf x_features(1,x_k_km1.rows()-13,x_k_km1.cols() );// = x_k_km1(14:end);
x_features =x_k_km1.block(13,0,x_k_km1.rows()-13 ,x_k_km1.cols() );

错误原因:使用了三个参数,真郁闷...

(1,x_k_km1.rows()-13,x_k_km1.cols() )

修改为:

(x_k_km1.rows()-13,x_k_km1.cols() )

就可以了!

Matlab移植到Eigen用到的词条的更多相关文章

  1. C++调用Matlab引擎及Eigen配置

    这个周开始要着手实现网格水印的代码了,虽然还什么都不会,但也只能一步步摸索着往前走了. 我要实现的论文题目是<<Watermarking 3D Polygonal Meshes in th ...

  2. matlab与vs混合编程/matlab移植

    前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部 ...

  3. C++矩阵库 Eigen 快速入门

    最近需要用 C++ 做一些数值计算,之前一直采用Matlab 混合编程的方式处理矩阵运算,非常麻烦,直到发现了 Eigen 库,简直相见恨晚,好用哭了. Eigen 是一个基于C++模板的线性代数库, ...

  4. C++矩阵库 Eigen 简介

    最近需要用 C++ 做一些数值计算,之前一直采用Matlab 混合编程的方式处理矩阵运算,非常麻烦,直到发现了 Eigen 库,简直相见恨晚,好用哭了. Eigen 是一个基于C++模板的线性代数库, ...

  5. [图解tensorflow源码] 入门准备工作附常用的矩阵计算工具[转]

    [图解tensorflow源码] 入门准备工作 附常用的矩阵计算工具[转] Link: https://www.cnblogs.com/yao62995/p/5773142.html  tensorf ...

  6. [图解tensorflow源码] 入门准备工作

     tensorflow使用了自动化构建工具bazel.脚本语言调用c或cpp的包裹工具swig.使用EIGEN作为矩阵处理工具.Nvidia-cuBLAS GPU加速计算库.结构化数据存储格式prot ...

  7. Python 的音乐库

    前言 其实处理这个用 Matlab 最方便,之前把 guitar-synthesizer 从 Matlab 移植到 Python,过程中更是体会到了这一点. 不过 Matlab 安装包又大,启动又慢, ...

  8. Python遥感数据主成分分析

    原文:http://www.cnblogs.com/leonwen/p/5158947.html 该算法由MatLab移植而来(具体参见上一篇博文).但是最终输出结果却和MatLab不一致,经排查发现 ...

  9. Eigen与Matlab语法及语义辞典

    Eigen为Matlab转换为C++提供了一个简单的语法级别的代码迁移工具. 对一些代码进行了扩充,以便程序由Matlab到Eigen的移植................... 参考链接:http: ...

随机推荐

  1. Redis 原子操作INCR

    The content below come from http://try.redis.io/ There is something special about INCR. Why do we pr ...

  2. Thawte

    Thawte 公司为 VeriSign(即:现更名为Symantec) 全资子公司,是全球第三大数字证书颁发机构(CA),成立于1995年,自1996年正式提供数字证书产品到1999年占领全球市场的4 ...

  3. 【Codeforces Global Round 1 E】Magic Stones

    [链接] 我是链接,点我呀:) [题意] 你可以把c[i]改成c[i+1]+c[i-1]-c[i] (2<=i<=n-1) 问你能不能把每一个c[i]都换成对应的t[i]; [题解] d[ ...

  4. Java基础学习总结(42)——Log4j 2使用教程

    1. 去官方下载log4j 2,导入jar包,基本上你只需要导入下面两个jar包就可以了(xx是乱七八糟的版本号): log4j-core-xx.jar log4j-api-xx.jar 2. 导入到 ...

  5. ReportNG 替换testng过程中遇到的问题

    1. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/collectio ...

  6. VNC Server Installation on CentOS 6.5

    In my case I have a fresh installed CentOS6.5 Server on which I will be installing the VNC-server so ...

  7. hdu 4950

    #include<stdio.h> int main(){ __int64 h,a,b,k,j=0; while(scanf("%I64d%I64d%I64d%I64d" ...

  8. 任务调度分配题两道 POJ 1973 POJ 1180(斜率优化复习)

    POJ 1973 这道题以前做过的.今儿重做一次.由于每个程序员要么做A,要么做B,可以联想到0/1背包(谢谢N巨).这样,可以设状态 dp[i][j]为i个程序员做j个A项目同时,最多可做多少个B项 ...

  9. 零基础学python-4.2 其它内建类型

    这一章节我们来聊聊其它内建类型 1.类型type 在python2.2的时候,type是通过字符串实现的,再后来才把类型和类统一 我们再次使用上一章节的图片来说明一些问题 我们通过对照上面的图片.在p ...

  10. Latex 排版技巧 1——数学公式对齐

    在我们排版数学推导式时,非常多时候我们希望可以让公式的等号对齐 这样更接近人的数学推导习惯 例如以下图效果图 使用 begin{aligned} end{aligned}将所需对齐的数学公式代码块包起 ...