原文:http://blog.csdn.net/houjixin/article/details/8492841

本文主要是Eigen中矩阵和向量的算术运算,在Eigen中的这些算术运算重载了C++的+,-,*,所以使用起来非常方便。

1、矩阵的运算

Eigen提供+、-、一元操作符“-”、+=、-=,例如:

二元操作符+/-表示两矩阵相加(矩阵中对应元素相加/减,返回一个临时矩阵): B+C 或 B-C;

一元操作符-表示对矩阵取负(矩阵中对应元素取负,返回一个临时矩阵): -C;

组合操作法+=或者-=表示(对应每隔元素都做相应操作):A += B 或者 A-=B

代码段1为矩阵的加减操作,代码如下:

[cpp] view plaincopy
  1. #include <iostream>
  2. #include <Eigen/Dense>
  3. using namespace Eigen;
  4. int main()
  5. {
  6. Matrix2d a;
  7. a << 1, 2,
  8. 3, 4;
  9. MatrixXd b(2,2);
  10. b << 2, 3,
  11. 1, 4;
  12. std::cout << "a + b =\n" << a + b << std::endl;
  13. std::cout << "a - b =\n" << a - b << std::endl;
  14. std::cout << "Doing a += b;" << std::endl;
  15. a += b;
  16. std::cout << "Now a =\n" << a << std::endl;
  17. Vector3d v(1,2,3);
  18. Vector3d w(1,0,0);
  19. std::cout << "-v + w - v =\n" << -v + w - v << std::endl;
  20. }

输出结果为:

a + b =
3 5
4 8
a - b =
-1 -12  0
Doing a += b;
Now a =
3 5
4 8
-v + w - v =
-1
-4
-6

另外,矩阵还提供与标量(单一个数字)的乘除操作,表示每个元素都与该标量进行乘除操作。例如:

二元操作符*在:A*a中表示矩阵A中的每隔元素都与数字a相乘,结果放在一个临时矩阵中,矩阵的值不会改变。

对于a*A、A/a、A*=a、A /=a也是一样,例如下面的代码:

[cpp] view plaincopy
  1. #include <iostream>
  2. #include <Eigen/Dense>
  3. using namespace Eigen;
  4. int main()
  5. {
  6. Matrix2d a;
  7. a << 1, 2,
  8. 3, 4;
  9. Vector3d v(1,2,3);
  10. std::cout << "a * 2.5 =\n" << a * 2.5 << std::endl;
  11. std::cout << "0.1 * v =\n" << 0.1 * v << std::endl;
  12. std::cout << "Doing v *= 2;" << std::endl;
  13. v *= 2;
  14. std::cout << "Now v =\n" << v << std::endl;
  15. }

输出结果为:

a * 2.5 =
2.5  5
7.5 10
0.1 * v =
0.1
0.2
0.3
Doing v *= 2;
Now v =
2
4
6

需要注意:

在Eigen中,算术操作例如 “操作符+”并不会自己执行计算操作,他们只是返回一个“算术表达式对象”,而实际的计算则会延迟到后面的赋值时才进行。这些不影响你的使用,它只是为了方便Eigen的优化。

2、求矩阵的转置、共轭矩阵、伴随矩阵。

可以通过 成员函数transpose(), conjugate(),和 adjoint()来完成,注意这些函数返回操作后的结果,而不会对原矩阵的元素进行直接操作,如果要让原矩阵的进行转换,则需要使用响应的InPlace函数,例如:transposeInPlace() 、 adjointInPlace() 之类。

例如下面的代码所示:

[cpp] view plaincopy
  1. MatrixXcf a = MatrixXcf::Random(2,2);
  2. cout << "Here is the matrix a\n" << a << endl;
  3. cout << "Here is the matrix a^T\n" << a.transpose() << endl;
  4. cout << "Here is the conjugate of a\n" << a.conjugate() << endl;
  5. cout << "Here is the matrix a^*\n" << a.adjoint() << endl;

输出结果为:

Here is the matrix a(-0.211,0.68) (-0.605,0.823)(0.597,0.566)  (0.536,-0.33)
Here is the matrix a^T
(-0.211,0.68) (0.597,0.566)
(-0.605,0.823) (0.536,-0.33)
Here is the conjugate of a(-0.211,-0.68) (-0.605,-0.823)(0.597,-0.566)    (0.536,0.33)
Here is the matrix a^*
(-0.211,-0.68) (0.597,-0.566)
(-0.605,-0.823)   (0.536,0.33)

3、矩阵相乘、矩阵向量相乘

矩阵的相乘,矩阵与向量的相乘也是使用操作符*,共有*和*=两种操作符,其用法可以参考如下代码:

[cpp] view plaincopy
  1. #include <iostream>
  2. #include <Eigen/Dense>
  3. using namespace Eigen;
  4. int main()
  5. {
  6. Matrix2d mat;
  7. mat << 1, 2,
  8. 3, 4;
  9. Vector2d u(-1,1), v(2,0);
  10. std::cout << "Here is mat*mat:\n" << mat*mat << std::endl;
  11. std::cout << "Here is mat*u:\n" << mat*u << std::endl;
  12. std::cout << "Here is u^T*mat:\n" << u.transpose()*mat << std::endl;
  13. std::cout << "Here is u^T*v:\n" << u.transpose()*v << std::endl;
  14. std::cout << "Here is u*v^T:\n" << u*v.transpose() << std::endl;
  15. std::cout << "Let's multiply mat by itself" << std::endl;
  16. mat = mat*mat;
  17. std::cout << "Now mat is mat:\n" << mat << std::endl;
  18. }

输出结果为:

Here is mat*mat:7 10
15 22
Here is mat*u:
1
1
Here is u^T*mat:
2 2
Here is u^T*v:
-2
Here is u*v^T:
-2 -02  0
Let's multiply mat by itself
Now mat is mat:7 10
15 22

Eigen矩阵的运算(二)相关推荐

  1. Eigen 学习文档: 矩阵和向量运算

    Eigen 学习文档: 矩阵和向量运算 本页旨在提供有关如何使用Eigen在矩阵.向量和标量之间执行算术的概述和一些详细信息. 介绍 Eigen通过重载常见的 C++ 算术运算符(如 +.-.*)或通 ...

  2. python数值运算实例_Python矩阵常见运算操作实例总结

    本文实例讲述了Python矩阵常见运算操作.分享给大家供大家参考,具体如下: python的numpy库提供矩阵运算的功能,因此我们在需要矩阵运算的时候,需要导入numpy的包. 一.numpy的导入 ...

  3. C#的winform矩阵简单运算

    C#的winform矩阵简单运算 程序截图 关键代码 using System; using System.Collections.Generic; using System.ComponentMod ...

  4. openCV图像矩阵Mat和二维数组的互相转换

    openCV图像矩阵Mat和二维数组的互相转换 在openCV的应用中,我们获取图像的矩阵信息很简单.但是我们可能想调用其他的矩阵运算库(比如Eigen库)来进行计算.那么我们就需要把openCV读取 ...

  5. 线性代数:第二章 矩阵及其运算:逆矩阵、分块矩阵

    第一节 矩阵及其运算 一.数学概念 定义1.1 由  个数  排成m行n列的数表 称为m行n列的矩阵,简称  矩阵,记作 二.原理,公式和法则 1.矩阵的加法 (1) 公式 (2) 运算律 2.数乘矩 ...

  6. python矩阵运算_Python矩阵常见运算操作实例总结

    本文实例讲述了Python矩阵常见运算操作.分享给大家供大家参考,具体如下: python的numpy库提供矩阵运算的功能,因此我们在需要矩阵运算的时候,需要导入numpy的包. 一.numpy的导入 ...

  7. CUDA编程:矩阵乘运算从CPU到GPU

    作者丨kaiyuan@知乎 来源丨https://zhuanlan.zhihu.com/p/573271688 本文主要介绍用CUDA实现矩阵乘法运算(C = A x B)的几个基本方法,帮助大家理解 ...

  8. 线性代数第二章矩阵及其运算详解

    一.线性方程组和矩阵 1.概念 如图所示,该矩阵称为m行n列矩阵 若行数和列数都等于n,则该矩阵称为n阶方阵 两个矩阵的行数相等,列数也相等,就称它们为同型矩阵 若A=(aij)和B=(bij)是同型 ...

  9. 减法公式运算法则_矩阵的运算及其运算规则

    原标题:矩阵的运算及其运算规则 今天清北学堂信息学金牌教研团队给大家汇总了一下矩阵的运算 一.矩阵的加法与减法 1.运算规则 设矩阵 则 清北学堂信息学金牌教研团队提醒,两个矩阵相加减,即它们相同位置 ...

最新文章

  1. 2022-2028年中国光掩膜行业市场行情监测及未来前景规划报告
  2. scanf()函数的用法和实践
  3. 设计模式-Builder模式
  4. apache的es的原理_Elasticsearch的原理简介
  5. 题解 CF682C 【Alyona and the Tree】
  6. IntelliJ IDEA 面板、菜单介绍
  7. 区块链只能算半个“信任机器”,隐私计算才是真正的信任机器?
  8. vue 如何调用微信分享_Vue开发 添加微信分享功能(全局分享)
  9. CentOS中zip压缩和unzip解压缩命令详解
  10. Win8 Style App 播放Smooth Streaming
  11. 故宫网售朝珠耳机 专家提醒注意保护知识产权(图)
  12. 陈纪修老师《数学分析》 第05章:微分中值定理及其应用 笔记
  13. mic in和line in
  14. 2019年度十大网络小说:玄幻小说独占六部,都市小说一本超神
  15. 基于IMDb数据集的情感分析(TF-IDF与机器学习实现)
  16. 小程序支付微信回调地址问题
  17. vnc远程linux命令,用VNC实现远程桌面共享(支持Windows, Linux, …) | 易水博客
  18. 漫威超级争霸战怎么用电脑玩 漫威超级争霸战模拟器教程
  19. FPGA基础(数字电路)
  20. java数组交换位置_Java数组元素位置交换?

热门文章

  1. python xlutils.copy_使用python的xlrd,xlwt和xlutils.copy保留样式
  2. unordered_map 碰撞处理 重哈希
  3. java {@link},Javadoc @see或{@link}?
  4. JavaScript面向对象及原型 及setTimeout
  5. fileZilla连接oracle服务器,传DMP文件
  6. 真正开源的MongoDB的替代品,MangoDB!
  7. 皮一皮:中文汉字真是博大精深...
  8. 轻量级实用PDF转换工具
  9. 如何写出安全的、基本功能完善的Bash脚本
  10. 告诉你你也学不会!中台灵感 SuperCell 的管理之道!