Matlab移植到Eigen用到的词条
同型矩阵运算满足加法交换律、结合律;并存在单位元、逆元、和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.多维重排
B = permute(A, order) ;
但由于经过重新排列,在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)
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用到的词条的更多相关文章
- C++调用Matlab引擎及Eigen配置
这个周开始要着手实现网格水印的代码了,虽然还什么都不会,但也只能一步步摸索着往前走了. 我要实现的论文题目是<<Watermarking 3D Polygonal Meshes in th ...
- matlab与vs混合编程/matlab移植
前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部 ...
- C++矩阵库 Eigen 快速入门
最近需要用 C++ 做一些数值计算,之前一直采用Matlab 混合编程的方式处理矩阵运算,非常麻烦,直到发现了 Eigen 库,简直相见恨晚,好用哭了. Eigen 是一个基于C++模板的线性代数库, ...
- C++矩阵库 Eigen 简介
最近需要用 C++ 做一些数值计算,之前一直采用Matlab 混合编程的方式处理矩阵运算,非常麻烦,直到发现了 Eigen 库,简直相见恨晚,好用哭了. Eigen 是一个基于C++模板的线性代数库, ...
- [图解tensorflow源码] 入门准备工作附常用的矩阵计算工具[转]
[图解tensorflow源码] 入门准备工作 附常用的矩阵计算工具[转] Link: https://www.cnblogs.com/yao62995/p/5773142.html tensorf ...
- [图解tensorflow源码] 入门准备工作
tensorflow使用了自动化构建工具bazel.脚本语言调用c或cpp的包裹工具swig.使用EIGEN作为矩阵处理工具.Nvidia-cuBLAS GPU加速计算库.结构化数据存储格式prot ...
- Python 的音乐库
前言 其实处理这个用 Matlab 最方便,之前把 guitar-synthesizer 从 Matlab 移植到 Python,过程中更是体会到了这一点. 不过 Matlab 安装包又大,启动又慢, ...
- Python遥感数据主成分分析
原文:http://www.cnblogs.com/leonwen/p/5158947.html 该算法由MatLab移植而来(具体参见上一篇博文).但是最终输出结果却和MatLab不一致,经排查发现 ...
- Eigen与Matlab语法及语义辞典
Eigen为Matlab转换为C++提供了一个简单的语法级别的代码迁移工具. 对一些代码进行了扩充,以便程序由Matlab到Eigen的移植................... 参考链接:http: ...
随机推荐
- 6.4.1 标准库 os、os.path 与 shutil 简介
os模块除了提供使用操作系统功能和访问文件系统的简便方法之外,还提供了大量文件与文件夹操作的方法,如下表所示. 方法 功能说明 access(path,mode) 按照 mode 指定的权限访问文件 ...
- eclipse 下使用 git
一.默认仓库文件夹 二.window -->perspective --> customize perspective 三.提交时,要忽略的文件
- oracle --审计
审计是监视和记录所选用户的数据活动的.审计操作类型包括登录企图.对象访问和数据库操作.审计记录包括被审计的操作.执行操作的用户.操作的时间等信息. 1 . 启用审计 其具体步骤如下: (1 ) 进入O ...
- poj 1860 bellman 求正环
#include<stdio.h> #include<string.h> #include<queue>//只需判断是否有正环路径就可以了 using namesp ...
- [poj3321]Apple Tree_dfs序_树状数组
Apple Tree poj-3321 题目大意:给你一个根固定的树,每一个点的点权是0或1,查询子树点权和. 注释:$1\le n \le 10^5$. 想法:刚刚学习dfs序,刷到水题偶哈哈. 什 ...
- N天学习一个Linux命令之帮助命令:man
前言 工作中每天都在使用常用的命令和非常用的命令,忘记了用法或者参数,都会bing一下,然后如此循环.一直没有真正的系统的深入的去了解命令的用法,我决定打破它.以前看到有人,每天学习一个linux命令 ...
- java获取类名不包括路径
class.getSimpleName(),就能获得仅仅的类名 class.getName()获得的是全路径的类名
- 优秀软件project师必备的7大特性
不是每个程序猿都能成为优秀的软件project师. 在过去的6年时间里,我在Ooyala.Quora和now Quip这3个创业公司面试过许很多多挺有发展潜力的"种子选手".他们都 ...
- (七)CAS 本地localhost调试,无法单点退出疑问
干活的时候要多思考-------- 题记 昨天下午接到任务把内容汇聚平台和分发平台加上统一认证登录,之前弄过CAS,想想这个过程也就是按部就班的事情.在两个系统中we ...
- 专业函数画图软件Origin
首先:Origin软件已经是科研院所等单位的必备工作软件之中的一个,之所以大家讨论得较少,有可能并非其上手难度低.而是这些使用人群的学习理解能力要相对高一点吧: 其次:Excel不垃圾,但在函数画图方 ...