ubuntu 扩容
https://blog.csdn.net/Carina_Cao/article/details/90270389
ubuntu 读取 matlab .mat
安装linux版matlab, 或者把库拷出来也可以
MATFile *pmatFile = NULL;
mxArray *pMxArray_pc = NULL;
mxArray *pMxArray_sn = NULL;
pmatFile = matOpen("/home/lin/slam/slz_manhattan/dotmat/1341841278.842683.png.mat","r");//使用matOpen函数打开mat文件
pMxArray_pc = matGetVariable(pmatFile, "PointCloud");//使用matGetVariable函数读取mat文件中的变量
PointCloud = (double*) mxGetData(pMxArray_pc);//使用mxGetData函数获取数据阵列中的数据
pMxArray_sn = matGetVariable(pmatFile, "sn");
sn = (double*) mxGetData(pMxArray_sn);
int pc_m = mxGetM(pMxArray_pc);//使用mxGetM和mxGetN函数获取数据阵列矩阵的维数
int pc_n = mxGetN(pMxArray_pc);
int sn_m = mxGetM(pMxArray_sn);//使用mxGetM和mxGetN函数获取数据阵列矩阵的维数
int sn_n = mxGetN(pMxArray_sn);
//Matrix<double, M, N> pc;
MatrixXd point_cloud_matxd( pc_m, pc_n);
MatrixXd surface_normal_matxd( sn_m, sn_n);
for(int i=0; i< sn_m; i++){
for(int j=0; j< sn_n; j++){
surface_normal_matxd(i,j)= *(sn+ sn_m* j+ i); //注意:读入存储正确的关键: .mat是一列一列存的
//cout<<"i,j: "<<i<<" "<<j<<"\n"<< surface_normal_matxd(i,j)<<endl;
//getchar();
}
}
https://www.cnblogs.com/excellentlhw/p/12009924.html
https://zlearning.netlify.app/communication/matlab/matlabcmexapi
https://blog.csdn.net/qq_41990294/article/details/109160857
官方
linux远程scp,但是不覆盖已经存在文件的方法
https://blog.csdn.net/yihui8/article/details/79923859
size_t和int区别
https://blog.csdn.net/qq_41598072/article/details/84924997
四元数的两种写法与转换
https://zhuanlan.zhihu.com/p/97936323
四元数使用一个实数和三个虚数组成的
表示形式为 h= w+ xi +yj +zk
其实数部分可能位于第一位,也可能位于第四位,而虚数部分的三个数字顺序保持不变。
一般的,如果四元数表示中采用abcd作为说明,则认为采用的是实数在前的表示方式,如果采用qx,qy,qz,qw作为说明,则认为是实数在后的表示方式
matlab和C语言eigen库将同一个四元数转换为旋转矩阵时,获得的两个旋转矩阵互为逆矩阵!
让C++控制台程序停下来,实现暂停功能
一、针对Microsoft
#include <stdlib.h>
(1)第一种方式
system( "PAUSE ");
--------------------
(2)第二种方式
getchar(); // 这招对QT程序也有用
---------------------
(3)第三种方式
Sleep();
二、针对Linux
(1)第一种方式
getchar();
Eigen中四元数Quaterniond初始
Eigen::Quaterniond q1(w, x, y, z);// 第一种方式!!实数在前
Eigen::Quaterniond q2(Vector4d(x, y, z, w));// 第二种方式 实数在后
Eigen::Quaterniond q2(Matrix3d(R));// 第三种方式
如果以第一种方式构造四元数,则实部是w, 虚部是[x,y,z];
对于第二种方式,则实部是w,虚部是[x,y,z];
对于第三种方式,则是用3x3的旋转矩阵初始化四元数。
整数除法int/int 得到浮点数: int. /int 、 int/double(int)
float ConvergeAngle = 1./180* pi;
if(bin[i].size()/ (double)(num_MF_cano) > ratio)
随机数
// 随机数种子 防止每次rand一样
srand( (unsigned)time( NULL ) );
int rand_num= rand() % num_MF
Eigen 3.2.29 操作记录.
基本初始化
Quaterniond q_gt0(0.2239, -0.4871, 0.7673, -0.3519);
Matrix3d R_gt0= q_gt0.toRotationMatrix();
Vector3d t_gt0(-2.5508, 0.9872, 1.1019);
特殊结构初始化
Matrix3d R_update= Matrix3d::Ones();
Matrix3d M = Matrix3d::Zero();
Vector4d q_vec= Vector4d::Random(); // 0-1 随机数
未知大小定义与初始化
MatrixXd nVp_inlier(3, index_inlier.size());
MatrixXd Paa = MatrixXd::Zero(3, num_MF);
旋转矩阵到角轴
AngleAxisd temp_AA;
temp_AA.fromRotationMatrix( R.transpose()* R);
角轴到旋转矩阵
AngleAxisd R_temp_aa(mean_Paa_temp.norm(), Vector3d(aa(0,0), aa(1,0), aa(2,0)));
MatrixXd R_temp= R_temp_aa.matrix();
四元数到旋转矩阵
Matrix3d R= q_R.toRotationMatrix().inverse();
取行列方法
Ra << R.col((a+3)%3).transpose(), R.col((a+4)%3).transpose(), R.col((a+5)%3).transpose();
nVp_inlier.col(i)= nVps.col(index_inlier[i]);
按元素除法、取绝对值、乘法
eta_inlier.cwiseQuotient(nVp_inlier.row(2).cwiseAbs());
alfa.cwiseQuotient(tan_alfa).cwiseProduct(nVp_inlier.row(0)).cwiseQuotient(nVp_inlier.row(2))
array 与matrix互相转换、 asin()反三角函数
MatrixXd alfa= eta_inlier.array().asin().matrix(); //array has asin, matrix don't
isnan、isinf
auto select= (1- f.array().isNaN()).matrix();
f.array().isInf()
二范数平方
F.col(i).squaredNorm()
二范数
q_vec /= q_vec.norm();
.finished()方法
MatrixXd M_ = Ra.transpose() * (MatrixXd (3,1) << ma_p, 1).finished();
叉乘
Vector3d v3 = v1.cross(v2);
点乘 dot
svd分解
JacobiSVD<MatrixXd> svd( M, ComputeThinU | ComputeThinV);
auto D= svd.singularValues();
auto U= svd.matrixU();
auto V= svd.matrixV();
迹:
(R.transpose()* R_update).trace()
行列式
R.determinant() > 0
转置
R.transpose()
逆
q_R.toRotationMatrix().inverse()