{"id":26255444,"url":"https://github.com/qchen-fdii-cardc/eigen3tutorial","last_synced_at":"2025-10-08T02:58:12.001Z","repository":{"id":279144206,"uuid":"937845930","full_name":"qchen-fdii-cardc/eigen3tutorial","owner":"qchen-fdii-cardc","description":"Eigen3教程和示例","archived":false,"fork":false,"pushed_at":"2025-02-26T01:17:41.000Z","size":219,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-09-10T18:00:14.152Z","etag":null,"topics":["eigen","eigen3","example","tutorial"],"latest_commit_sha":null,"homepage":"http://www.windtunnel.cn/eigen3tutorial/","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qchen-fdii-cardc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-02-24T02:05:31.000Z","updated_at":"2025-02-26T03:14:45.000Z","dependencies_parsed_at":"2025-09-10T15:49:27.149Z","dependency_job_id":"a4e61d47-8d6f-40e9-9549-fbf921a6f2c7","html_url":"https://github.com/qchen-fdii-cardc/eigen3tutorial","commit_stats":null,"previous_names":["qchen-fdii-cardc/eigen3tutorial"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/qchen-fdii-cardc/eigen3tutorial","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qchen-fdii-cardc%2Feigen3tutorial","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qchen-fdii-cardc%2Feigen3tutorial/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qchen-fdii-cardc%2Feigen3tutorial/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qchen-fdii-cardc%2Feigen3tutorial/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qchen-fdii-cardc","download_url":"https://codeload.github.com/qchen-fdii-cardc/eigen3tutorial/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qchen-fdii-cardc%2Feigen3tutorial/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278881831,"owners_count":26062176,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["eigen","eigen3","example","tutorial"],"created_at":"2025-03-13T19:18:50.363Z","updated_at":"2025-10-08T02:58:11.985Z","avatar_url":"https://github.com/qchen-fdii-cardc.png","language":"C++","readme":"---\r\nlayout: default\r\ntitle: Eigen 教程\r\npermalink: /\r\n---\r\n\r\n# Eigen3 教程 （施工中）\r\n\r\n这是一个 Eigen C++ 线性代数库的教程项目，包含了从基础到高级的示例代码。\r\n\r\n这个教程与[Eigen 官方文档](https://eigen.tuxfamily.org/dox/) 的区别是什么？\r\n\r\n- 官方文档是英文的，这个教程是中文的。\r\n- 官方文档是按照Eigen 的源码顺序组织的，这个教程是按照实际应用的顺序组织的。\r\n- 官方文档是面向Eigen 的开发者或者想要深入了解Eigen 的实现原理的读者，这个教程是面向需要使用Eigen 库解决实际问题的读者。\r\n- 应用中的实际问题和解决方案都采用实际的代码进行测试和说明，例如POD、Kalman滤波等实际代码都是有具体的背景和应用场景，本教程尽量做到与实际应用相结合。\r\n\r\n\r\n## 环境要求\r\n\r\n- C++11 或更高版本\r\n- CMake 3.10 或更高版本\r\n- Eigen 3.4 或更高版本\r\n\r\n### 查看 Eigen 版本\r\n```bash\r\n# 使用 pkg-config\r\npkg-config --modversion eigen3\r\n\r\n# 或者查看头文件\r\ngrep \"#define EIGEN_.*_VERSION\" /usr/include/eigen3/Eigen/src/Core/util/Macros.h\r\n```\r\n\r\n文档附带的源代码中包括了一个`eigen3version.cpp`文件，正常能够编译运行的话， 会在终端打印Eigen 的版本。这一方面可以确认版本，另一方面可以确认Eigen 和相应工具链的配置是正确的。\r\n\r\n## 安装 Eigen\r\n\r\n### Ubuntu/Debian\r\n```bash\r\nsudo apt-get update\r\nsudo apt-get install libeigen3-dev\r\n```\r\n\r\n### macOS\r\n```bash\r\nbrew install eigen\r\n```\r\n\r\n### Windows\r\n1. 使用 vcpkg:\r\n```bash\r\nvcpkg install eigen3:x64-windows\r\n```\r\n\r\n2. 或者手动下载:\r\n- 访问 [Eigen 官网下载页面](https://eigen.tuxfamily.org/index.php?title=Main_Page#Download)\r\n- 下载[最新版本](https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.zip)\r\n- 解压到合适的位置，例如`D:\\Eigen3`\r\n\r\n### 配置环境变量\r\n\r\n安装之后，需要配置环境变量，否则在编译时会找不到Eigen 的头文件。默认采用`apt`安装的Eigen 头文件位置为`/usr/include/eigen3`。因此，我们在编译时可以直接使用`-I/usr/include/eigen3`指定头文件位置。\r\n\r\n```bash\r\ng++ -I/usr/include/eigen3 eigen3version.cpp -o eigen3version\r\n./eigen3version\r\n```\r\n\r\n如果能够正常打印Eigen 的版本，则说明Eigen 安装成功。\r\n\r\n如果不希望每次编译都需要指定头文件位置，可以配置环境变量。打开`.bashrc`文件，添加以下内容：\r\n\r\n```bash\r\nvim ~/.bashrc\r\n```\r\n\r\n在文件末尾添加以下内容：\r\n\r\n```bash\r\nexport EIGEN_ROOT=/usr/include/eigen3\r\nexport CPLUS_INCLUDE_PATH=$EIGEN_ROOT:$CPLUS_INCLUDE_PATH\r\n```\r\n\r\n保存文件并退出。然后重新加载`.bashrc`文件：\r\n\r\n```bash\r\nsource ~/.bashrc\r\n```\r\n\r\n这样我们就可以在编译时直接使用`-I/usr/include/eigen3`指定头文件位置，而不需要每次都指定。当然，Eigen最好的地方（个人观点）也就是，它只有头文件，没有库文件，所以不需要链接和设置链接选项。\r\n\r\n### Windows 下微软编译器\r\n\r\n采用微软编译器编译Eigen 时，同样需要指定头文件位置，运行`vcvarsall.bat`脚本设置环境变量，然后调用`cl`命令编译。\r\n\r\n```powershell\r\nvcvarsall.bat\r\ncl eigen3version.cpp /I \"D:\\Eigen3\\eigen-3.4.0\"\r\n```\r\n\r\n因为我们采用`cmake`编译，所以需要修改`CMakeLists.txt`文件，所以在Windows下面基本上也都是一样一样的。\r\n\r\n\r\n## 项目总体结构\r\n\r\n\r\n```\r\neigen3tutorial/\r\n├── chapters/\r\n├── CMakeLists.txt\r\n├── eigen3version.cpp\r\n├── README.md\r\n├── chp01/          # 基础知识\r\n│   ├── basic_matrix.cpp\r\n│   ├── matrix_arithmetic.cpp\r\n│   └── special_matrices.cpp\r\n├── chp02/          # 矩阵操作\r\n│   ├── matrix_operations.cpp\r\n│   └── matrix_decompositions.cpp\r\n├── chp03/          # 向量操作\r\n│   ├── vector_operations.cpp\r\n│   └── vector_advanced.cpp\r\n├── chp04/          # 线性方程\r\n│   ├── linear_equations.cpp\r\n│   └── least_squares.cpp\r\n├── chp05/          # 特征值\r\n│   ├── eigenvalues.cpp\r\n│   └── pca_example.cpp\r\n├── chp06/          # 几何变换\r\n│   ├── transforms.cpp\r\n│   └── rotations.cpp\r\n└── chp07/          # 高级特性\r\n    ├── sparse_matrix.cpp\r\n    └── advanced_features.cpp\r\n```\r\n\r\n\r\n本项目的结构设计旨在帮助用户快速找到所需的示例代码和文档。项目的根目录包含以下主要部分：\r\n\r\n- `chapters/`: 包含每个章节的详细内容和示例代码。\r\n- `CMakeLists.txt`: 项目的 CMake 配置文件，用于构建和编译示例代码。\r\n- `eigen3version.cpp`: 一个简单的程序，用于检查 Eigen 库的版本。\r\n- `README.md`: 项目的主要文档，提供了安装、配置和使用的指南。\r\n- `chp01/` 至 `chp07/`: 每个子目录对应一个特定的主题或功能模块，包含相关的示例代码文件。\r\n\r\n每个章节目录（如 `chp01/`）中包含多个 C++ 源文件，这些文件展示了如何使用 Eigen 库解决特定的线性代数问题。通过这种结构，用户可以轻松地导航到感兴趣的主题并查看相关的代码示例。\r\n\r\n## 编译和运行\r\n\r\n1. 创建构建目录：\r\n```bash\r\nmkdir build\r\ncd build\r\n```\r\n\r\n2. 配置 CMake：\r\n```bash\r\ncmake ..\r\n```\r\n\r\n如果 Eigen 安装在非标准位置，需要指定 Eigen3_DIR：\r\n```bash\r\ncmake .. -DEigen3_DIR=/path/to/eigen3/share/eigen3/cmake\r\n```\r\n\r\n3. 编译：\r\n```bash\r\ncmake --build .\r\n```\r\n\r\n4. 运行示例：\r\n```bash\r\n./basic_matrix\r\n./matrix_arithmetic\r\n# ... 其他示例\r\n```\r\n\r\n\r\n## 其他注意事项\r\n\r\n1. 包含路径：\r\n   - 如果使用系统安装的 Eigen：`#include \u003cEigen/...\u003e`\r\n   - 如果使用自定义路径：可能需要调整 CMakeLists.txt 中的 include_directories\r\n\r\n2. 编译优化：\r\n   - 建议开启 -O2 或 -O3 优化\r\n   - SIMD 优化选项：\r\n     * -march=native （自动检测并启用当前CPU支持的所有指令集）\r\n     * -msse4.2 （启用 SSE4.2 指令集）\r\n     * -mavx （启用 AVX 指令集）\r\n     * -mavx2 （启用 AVX2 指令集）\r\n     * -mfma （启用 FMA 指令集）\r\n\r\n3. 内存对齐：\r\n   - Eigen 默认使用 16 字节对齐\r\n   - 在类中使用固定大小的 Eigen 对象时，需要使用 EIGEN_MAKE_ALIGNED_OPERATOR_NEW\r\n\r\n## 许可\r\n\r\n本项目采用 MIT 许可证。详细信息请查看 [LICENSE](LICENSE) 文件。\r\n\r\n您可以自由地：\r\n- 使用、复制、修改、合并、出版发行、散布、再授权及贩售本软件的副本。\r\n- 不需要为修改后的软件做特别标注。\r\n\r\n但必须：\r\n- 在软件和软件的所有副本中都必须包含以上版权声明和本许可声明。\r\n\r\n## 参考资料\r\n\r\n- [Eigen 官方文档](https://eigen.tuxfamily.org/dox/)\r\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqchen-fdii-cardc%2Feigen3tutorial","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqchen-fdii-cardc%2Feigen3tutorial","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqchen-fdii-cardc%2Feigen3tutorial/lists"}