1 向量和矩阵的运算主要包含
(1)矩阵和矩阵的运算
(2)向量和向量的运算
(3)矩阵和向量的运算
(4)矩阵和向量的标量运算
(5)矩阵的自身运算、分解、逆矩阵、伴随矩阵
2 易犯错误点
(1)向量的叉乘只能针对三维向量,向量的点乘对于向量长度没有限制;
(2)向量默认为行向量;
(3)矩阵和矩阵的除法,需要转换为数组运算
(4)向量和向量的乘法和除法则需要转换为数组运算;
(5)数组运算是支持所有数学运算的,数组和矩阵可以互相转化。
3? 使用说明
#include<iostream>
#include<vector>
#include<array>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
void main()
{
//向量和向量运算
Eigen::Vector3f vec1(1, 2, 3);
Eigen::Vector3f vec2(1, 2, 3);
std::cout << vec1+vec2 << std::endl;//246
std::cout << vec1-vec2 << std::endl;//000
std::cout << vec1.array() * vec2.array() << std::endl;//149
std::cout << vec1.array() / vec2.array() << std::endl;//111
//点应向量的元素相乘在乘,对相加,长度任意
std::cout << vec1.dot(vec2) << std::endl;//14
//向量的叉乘,新的向量垂直于原来的两个向量,只能是长度为3的向量
std::cout << vec1.cross(vec2) << std::endl;//000
//矩阵和矩阵的运算
Eigen::MatrixXd m1(2, 2);
m1 << 1, 2, 3, 4;
Eigen::MatrixXd m2(2, 2);
m2 << 1, 2, 3, 4;
std::cout << m1 + m2 << std::endl;
std::cout << m1 - m2 << std::endl;
std::cout << m1 * m2 << std::endl;
std::cout << m1 * 0.1 << std::endl;
//矩阵无法直接进行除法,需要转换为数组后在进行除法,本质就是矩阵每一个元素相除
std::cout << m1.array() / m2.array() << std::endl;
//矩阵和向量的运算
Eigen::Vector3f vec11(1,2,3);
Eigen::MatrixXf m4(3, 3);
m4 << 1, 2, 3, 4, 5, 6, 7, 8, 9;
//矩阵和向量的运算必须保证维度一样,简言之就是从矩阵中拿出一个向量再进行运算
std::cout << m4.col(1) + vec11 << std::endl;
std::cout << m4.col(1) - vec11 << std::endl;
std::cout << m4.col(1).array() * vec11.array() << std::endl;
std::cout << m4.col(1).array() / vec11.array() << std::endl;
//向量的长度任意
std::cout << m4.col(1).dot( vec11)<< std::endl;
Eigen::Vector3f block = m4.row(1);
//向量的长度只能为3
std::cout << block.cross(vec11) << std::endl;
矩阵的计算,转置、共轭、伴随
Eigen::MatrixXf m5(2, 2);
m5 << 1, 2, 3, 4;
cout << "Here is the matrix a\n" << m5 << endl;
cout << "Here is the matrix a^T\n" << m5.transpose() << endl;
cout << "Here is the conjugate of a\n" << m5.conjugate() << endl;
cout << "Here is the matrix a^*\n" << m5.adjoint() << endl;
QR分解
Matrix3d A;
A << 1, 1, 1, 2, -1, -1, 2, -4, 5;
HouseholderQR<Matrix3d> qr;
qr.compute(A);
MatrixXd R = qr.matrixQR().triangularView<Upper>();
MatrixXd Q = qr.householderQ();
std::cout << "QR2(): HouseholderQR---------------------------------------------" << std::endl;
std::cout << "A " << std::endl << A << std::endl << std::endl;
std::cout << "qr.matrixQR()" << std::endl << qr.matrixQR() << std::endl << std::endl;
std::cout << "R" << std::endl << R << std::endl << std::endl;
std::cout << "Q " << std::endl << Q << std::endl << std::endl;
std::cout << "Q*R" << std::endl << Q * R << std::endl << std::endl;
}
参考博客:
Eigen中的基本函数_我是小沙的博客-CSDN博客_eigen函数Eigen: C++开源矩阵计算工具——Eigen的简单用法_Augusdi的博客-CSDN博客_eigen矩阵Eigen中的基本函数_我是小沙的博客-CSDN博客_eigen函数
|