跟着官方教程使用了虚拟机,Eigen: Matrix and vector arithmetic ,使用 cmake 进行编译
GAMES101 现代计算机图形学入门 官方教程 作业0发布公告 – 计算机图形学与混合现实在线平台 (games-cn.org)
虚拟机安装
超级详细的 VirtualBox 虚拟机安装 及入门教程-CSDN博客
代码框架
#include<cmath>
#include<eigen3/Eigen/Core>
#include<eigen3/Eigen/Dense>
#include<iostream>
int main(){
// Basic Example of cpp
std::cout << "Example of cpp \n";
float a = 1.0, b = 2.0;
std::cout << a << std::endl;
std::cout << a/b << std::endl;
std::cout << std::sqrt(b) << std::endl;
std::cout << std::acos(-1) << std::endl;
std::cout << std::sin(30.0/180.0*acos(-1)) << std::endl;
// Example of vector
std::cout << "Example of vector \n";
// vector definition
Eigen::Vector3f v(1.0f,2.0f,3.0f);
Eigen::Vector3f w(1.0f,0.0f,0.0f);
// vector output
std::cout << "Example of output \n";
std::cout << v << std::endl;
// vector add
std::cout << "Example of add \n";
std::cout << v + w << std::endl;
// vector scalar multiply
std::cout << "Example of scalar multiply \n";
std::cout << v * 3.0f << std::endl;
std::cout << 2.0f * v << std::endl;
// Example of matrix
std::cout << "Example of matrix \n";
// matrix definition
Eigen::Matrix3f i,j;
i << 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0;
j << 2.0, 3.0, 1.0, 4.0, 6.0, 5.0, 9.0, 7.0, 8.0;
// matrix output
std::cout << "Example of output \n";
std::cout << i << std::endl;
// matrix add i + j
// matrix scalar multiply i * 2.0
// matrix multiply i * j
// matrix multiply vector i * v
return 0;
}
头文件
在 Eigen 库中,#include<eigen3/Eigen/Core>
和 #include<eigen3/Eigen/Dense>
都用于引入库的不同部分,但它们所包含的内容和用途有所不同。
-
#include<eigen3/Eigen/Core>
:- 这个指令引入了 Eigen 库的核心模块,它包括了进行线性代数计算所必需的基本组件。
- 核心模块定义了矩阵和向量的类(例如
Eigen::Matrix
和Eigen::Vector
),以及一些基本的线性代数运算,如加法、减法、标量乘法、转置等。 - 它还包含了 Eigen 的大部分数据类型和基础功能,但并不包括对特定矩阵分解或更高级运算的支持。
Eigen/Core
是 Eigen 库中其他模块的基石,通常作为其他模块的依赖。
-
#include<eigen3/Eigen/Dense>
:- 这个指令引入了 Eigen 库中处理密集矩阵和数组的模块。
Eigen/Dense
模块依赖于Eigen/Core
,因此它包含了核心模块的所有功能,并且还扩展了对密集矩阵和向量的支持,包括更复杂的线性代数运算,如矩阵乘法、求逆、分解(LU、Cholesky、QR、SVD 等)。- 这个模块提供了对动态大小和固定大小矩阵的支持,以及对各种数学运算和函数的广泛覆盖。
Eigen/Dense
是进行大多数线性代数计算时最常用的模块,特别是当你需要进行矩阵分解或其他高级操作时。
总结来说,Eigen/Core
提供了 Eigen 的基础功能,而 Eigen/Dense
在此基础上增加了对密集矩阵和向量操作的全面支持。在大多数情况下,如果你需要进行矩阵运算,你可能会直接包含 Eigen/Dense
,因为它已经包含了 Eigen/Core
的所有内容。如果你的项目只需要使用 Eigen 的一小部分功能,或者你想要减小编译时的依赖和大小,你可以选择只包含 Eigen/Core
。
使用 cmake 进行编译
CMake 是一个跨平台的自动化构建系统,它使用配置文件(CMakeLists.txt)来生成标准的构建文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程文件。以下是使用 CMake 进行编译的一般步骤:
-
编写 CMakeLists.txt 文件:这是 CMake 项目的配置文件,它定义了项目的构建规则和目标。
-
创建构建目录:为了保持源代码目录的干净,通常会创建一个单独的构建目录。
-
运行 CMake:在构建目录中运行 CMake 来生成构建系统。
-
编译项目:使用生成的构建系统来编译项目。
下面是这些步骤的详细说明:
步骤 1: 编写 CMakeLists.txt 文件
在你的项目根目录中创建一个 CMakeLists.txt
文件,这个文件包含了构建项目的指令。例如:
cmake
cmake_minimum_required(VERSION 3.10)
project(MyProject)
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
# 添加可执行文件
add_executable(MyProject main.cpp)
步骤 2: 创建构建目录
在你的项目根目录下创建一个构建目录,通常命名为 build
:
bash
mkdir build
cd build
步骤 3: 运行 CMake
在构建目录中运行 CMake,指定源代码目录:
bash
cmake ..
这个命令会根据 CMakeLists.txt
文件生成适合你系统的构建文件。如果你使用的是 Unix 系统,它会生成 Makefile
;如果你使用的是 Windows,它会生成 Visual Studio 解决方案文件。
步骤 4: 编译项目
使用生成的构建系统来编译项目:
-
对于 Unix 系统:
bash
make
这将使用
make
工具来编译项目。 -
对于 Windows 系统:
如果你生成的是 Visual Studio 解决方案文件,你可以打开
.sln
文件并使用 Visual Studio 来编译项目。或者,如果你使用的是 Ninja 或其他生成器,你可以使用相应的命令来编译项目。
其他
"Bash" 是 "Bourne Again SHell" 的缩写,它是一种广泛使用的 Unix shell 和命令语言。Bash 是 GNU 操作系统的一部分,用于与操作系统交互,控制程序执行,以及自动化任务。它是由 Brian Fox 为 GNU 项目编写的,作为对传统 Bourne shell(sh)的改进。
Bash 具有以下特点:
- 命令解释执行:Bash 读取命令行输入,解释命令,然后执行它们。
- 脚本编程:Bash 支持脚本编程,允许用户编写包含多个命令的脚本文件,这些脚本可以自动化复杂的任务。
- 命令历史:Bash 保存用户输入的命令历史,允许用户通过历史记录快速重复或修改以前的命令。
- 命令别名:用户可以为常用的命令序列创建别名,简化日常操作。
- 管道和重定向:Bash 支持管道(|)和输入/输出重定向,允许用户将一个命令的输出作为另一个命令的输入,以及控制输出到文件或从文件中读取输入。
- 环境变量:Bash 允许用户设置和管理环境变量,这些变量可以影响程序的行为。
- 强大的文本处理:Bash 内置了许多文本处理工具,如
echo
、grep
、sed
、awk
等。
Bash 是大多数 Linux 发行版和 macOS 系统的默认 shell,它也是许多系统管理员和程序员的首选 shell。