VSC构建cmake工程
1.文件准备
1-1
在准备用vs code打开的文件夹下:
新建文件:CMakeLists.txt
内容:
cmake_minimum_required(VERSION 2.8)
project(useEigen)
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-O3")
# 添加Eigen头文件
include_directories("/usr/include/eigen3")
add_executable(test test.cpp)
注意这里测试eigen库的使用,可执行文件为cpp
1-2
创建test.cpp主程序
见附录(这里贴上导入头文件部分)
#include <iostream>
using namespace std;
#include <ctime>
// Eigen 核心部分
#include <eigen3/Eigen/Core>
// 稠密矩阵的代数运算(逆,特征值等)
#include <eigen3/Eigen/Dense>
using namespace Eigen;
2. 进行调试
2-1 在vs code中打开项目文件夹,这里叫做useeigen
2-2 点击左侧小蜘蛛,然后点击——创建launch文件(忘记截图)
3-3 这个时候资源管理器下就会生成.vscode文件夹,下面有个launch.json文件,将内容改为如下
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/test",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
也就是说,你可以直接复制我贴出来的这段程序,然后"program": "${workspaceFolder}/build/test"这里改成你自己的,但是注意,一定要有build,这个是vs code帮你自动创建的,然后test的可执行程序也是vs code在build下帮你创建的,这里之所以要写test是因为你的CMakeList.txt中可执行程序叫做test:
add_executable(test test.cpp)
其他地方无需修改。
(总结:根据CMakeLists.txt文件内容,将会在build文件夹下生成test可执行文件)
3-3 然后点击界面最下方的build, 选择GCC5.4… ,开始build…然后就在build问价夹下生成了result可执行文件,有了可执行文件才能进行debug操作。(底部蓝色那里)
3-4 点击F5进行调试,当然了,可以在左侧双击设置断点。
输出成功。
4.补充
以后若想还在这个文件夹下运行其他cpp执行文件,那么除了在CmakeList.txt中加一下可执行文件,再需要在launch,json文件中改一下build后面的可执行程序名称即可
附录
#include <iostream>
using namespace std;
#include <ctime>
// Eigen 核心部分
#include <eigen3/Eigen/Core>
// 稠密矩阵的代数运算(逆,特征值等)
#include <eigen3/Eigen/Dense>
using namespace Eigen;
#define MATRIX_SIZE 50t
int main(int argc, char** argv)
{
// // 声明2*3的矩阵
Matrix<float, 2, 3> matrix_23;
Vector3d v_3d;
Matrix<float, 3, 1> vd_3d;
Matrix3d matrix33 = Matrix3d::Zero(); // 初始化为0
cout<<matrix33<<endl;
// 矩阵赋值,可以按照顺序赋值,也可以直接索引进行赋值
matrix_23<<1,2,3,4,5,6;
cout<<"matrix_23: \n"<<matrix_23<<endl;
matrix_23(0,1) = 100;
cout<<"after_matrix_23: \n"<<matrix_23<<endl;
// 打印向量
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
cout<<matrix_23(i,j)<<"\t";
}
cout<<endl;
}
// 矩阵和向量相乘
v_3d << 3,2,1;
vd_3d<<4,5,6;
Matrix<double, Dynamic, Dynamic> result = matrix_23.cast<double>() * v_3d; // 注意想乘必须类型相同
cout<<"[1,2,3;4,5,6]*[3,2,1] = \n"<<result.transpose()<<endl; // transpose表示转置
MatrixXd result2 = matrix_23.cast<double>() * v_3d;
cout<<"result2:\n"<<result2<<endl; // 可以用MatrixXd定义毫不知情的时候的矩阵,用来接计算结果
// cout<<matrix_23.cast<double>() * v_3d<<endl; // 直接这样也是可以的
// 矩阵与矩阵相乘直接用乘法(注意维度匹配)
cout<<matrix_23.transpose()*matrix_23<<endl;
// 随机数矩阵
srand( (unsigned int )time(NULL) );
matrix33 = Matrix3d::Random();
cout<<"random矩阵:\n"<<matrix33<<endl;
// 转置
cout<<"random矩阵的转置:\n"<<matrix33.transpose()<<endl;
// 各个元素和
cout<<"sum:\n"<<matrix_23.sum()<<endl;
// 矩阵的迹(主对角线元素的和)
cout<<"迹:\n"<<matrix33.trace()<<endl;
// 逆
cout<<"逆:\n"<<matrix33.inverse()<<endl;
// 计算行列式
cout<<"计算行列式结果:\n"<<matrix33.determinant()<<endl;
// 计算特征值,特征向量
SelfAdjointEigenSolver<Matrix3d> es(matrix33);
cout<<"矩阵的特征值:\n"<<es.eigenvalues()<<endl;
cout<<"矩阵的特征向量:\n"<<es.eigenvectors()<<endl;
// 解方程 Ax = b类,可以直接求逆然后算,但是计算量大
Matrix<double, MATRIX_SIZE,MATRIX_SIZE> matrix_NN = MatrixXd::Random(MATRIX_SIZE,MATRIX_SIZE);
matrix_NN = matrix_NN*matrix_NN.transpose(); // 保证半正定
Matrix<double, MATRIX_SIZE, 1> v_Nd = MatrixXd::Random(MATRIX_SIZE,1);
clock_t time_stt = clock();
// 求逆的方法 4ms
Matrix<double, MATRIX_SIZE,1> x = matrix_NN.inverse()*v_Nd;
cout << "time of normal inverse is "
<< 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
cout << "x = " << x.transpose() << endl;
// 通常用矩阵分解来求解,例如QR分解,速度快很多 0.112ms
time_stt = clock();
x = matrix_NN.colPivHouseholderQr().solve(v_Nd);
cout << "time of normal inverse is "
<< 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
cout << "x = " << x.transpose() << endl;
// 对于正定矩阵,还可以用cholesky分解 0.03ms
time_stt = clock();
x = matrix_NN.ldlt().solve(v_Nd);
cout << "time of normal inverse is "
<< 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
cout << "x = " << x.transpose() << endl;
return 0;
}