矩阵计算
#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{
Matrix2f A, b;
// LLT<Matrix2f> llt;
A << 2, -1, -1, 3;
b << 1, 2, 3, 1;
cout << "Here is the matrix A:\n" << A << endl;
cout << "Here is the right hand side b:\n" << b << endl;
cout << "The solution is:\n" << A.llt().solve(b) << endl;
}
其中A.llt().solve(b)
的结果就是Ax=b表达式中的x的解
Eigen和GLM
Eigen中的norm()
函数和GLM中的length()
函数的功能是一样的
两个向量叉乘等于0表示这两个向量平行
OpenMP并行编程
#pragma omp parallel for
是OpenMP中的一个指令,表示接下来的for循环将被多线程执行,另外每次循环之间不能有关系,如下:
int main(int argc, char* argv[])
{
#pragma omp parallel for //后面是for循环
for (int i = 0; i < 10; i++ )
{
printf("i = %d/n", i);
}
return 0;
}
这个程序执行后打印出以下结果:
i = 0
i = 5
i = 1
i = 6
i = 2
i = 7
i = 3
i = 8
i = 4
i = 9
for循环里的内容必须满足可以并行执行,即每次循环互不相干,后一次循环不依赖于前面的循环
向量的归一化
norm()
是 Frobenius 范数, 所有元素平方之和的平方根normalize()
会将向量本身改变进行归一化normalized()
会返回一个归一化向量,但不会改变向量本身
代码:
#include <Eigen/Eigen>
#include <iostream>
int main()
{
Eigen::VectorXd A(3);
A(0) = 1.;
A(1) = 2.;
A(2) = 3.;
std::cout << "A.norm() = " << std::endl;
std::cout << A.norm() << std::endl;
Eigen::VectorXd B = A.normalized();
std::cout << "B = " << std::endl;
std::cout << B << std::endl;
std::cout << "A = " << std::endl;
std::cout << A << std::endl;
A.normalize();
std::cout << "A = " << std::endl;
std::cout << A << std::endl;
}
编译结果:
A.norm() =
3.74166
B =
0.267261
0.534522
0.801784
A =
1
2
3
A =
0.267261
0.534522
0.801784
Eigen中的类型转换
Matrix2i a;
Matrix2d b;
aaa << 1.1, 2.3,
4.6, 4;
a = b.cast<int>();
当两个矩阵的类型不同时,不能进行矩阵的运算,会报错,此时可以使用矩阵.cast<要转换的类型>();
来对矩阵进行转换,使得两个矩阵的类型相同。