这几天用到了逆矩阵,就在这里总结一下逆矩阵和转置矩阵。

逆矩阵

逆矩阵就是一个矩阵的逆向。比如一个点乘以一个矩阵后得到了一个新的点的位置,如果想通过这个点再获得矩阵转换前的位置,那我们就需要乘以这个矩阵的逆矩阵。
在Three.js里面,我们可以通过new THREE.Matrix4().getInverse(matrix4)方法来获得一个矩阵的逆矩阵。

具有的性质:
可逆矩阵一定是方阵。
如果矩阵是可逆的,那它的逆矩阵具有唯一性。
矩阵A的逆矩阵的逆矩阵,等于它自身。

Three.js获得一个矩阵的逆矩阵:

var m = `new THREE.Matrix4().getInverse(matrix4);

Three.js求逆矩阵源码:

     getInverse: function ( m, throwOnDegenerate ) {// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htmvar te = this.elements,me = m.elements,n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;if ( det === 0 ) {var msg = "THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0";if ( throwOnDegenerate === true ) {throw new Error( msg );} else {console.warn( msg );}return this.identity();}var detInv = 1 / det;te[ 0 ] = t11 * detInv;te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;te[ 4 ] = t12 * detInv;te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;te[ 8 ] = t13 * detInv;te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;te[ 12 ] = t14 * detInv;te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;return this;}

转置矩阵

说到转置矩阵,这里就要说一下矩阵的排列。矩阵的排列有两种方式:行优先和列优先。而转置矩阵其实就是行优先和列优先之间的切换。
两种方式在数学上没有什么不同,大多数人都习惯上使用行优先。在Three.js中,我们需要通过行优先设置,而在存储中,则使用列优先存储数据到elements。
设置矩阵时使用行优先:

var m = new Matrix4();m.set( 11, 12, 13, 14,21, 22, 23, 24,31, 32, 33, 34,41, 42, 43, 44 );

元素数组elements将存储为:

m.elements = [ 11, 21, 31, 41,12, 22, 32, 42,13, 23, 33, 43,14, 24, 34, 44 ];

在Three.js中,我们可以同过transpose()方法,将矩阵转置:

matrix.transpose();

Three.js的转置源码:

 transpose: function () {var te = this.elements;var tmp;tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;return this;},

矩阵的逆矩阵 和 转置矩阵相关推荐

  1. java 伴随矩阵_C#计算矩阵的逆矩阵方法实例分析

    本文实例讲述了C#计算矩阵的逆矩阵方法.分享给大家供大家参考.具体如下: 1.代码思路 1)对矩阵进行合法性检查:矩阵必须为方阵 2)计算矩阵行列式的值(Determinant函数) 3)只有满秩矩阵 ...

  2. c语言矩阵的逆的程序,C语言求矩阵的逆矩阵

    <C语言求矩阵的逆矩阵>由会员分享,可在线阅读,更多相关<C语言求矩阵的逆矩阵(12页珍藏版)>请在人人文库网上搜索. 1.C语言求矩阵的逆矩阵班级: 自动化1604小组成员: ...

  3. C++:计算对称正定 (SPD) 矩阵的逆矩阵(附完整源码)

    C++:计算对称正定 (SPD) 矩阵的逆矩阵 test.hpp test.cpp test.hpp void cholesky ( double a[], int n, int nn, double ...

  4. 线性代数让我想想:快速求三阶矩阵的逆矩阵

    快速求三阶矩阵的逆矩阵 前言 一般情况下,我们求解伴随矩阵是要注意符号问题和位置问题的(如下所示) A−1=1[][−[]−[]−[]−[]]=A−1=1[][M11−[M12]M13−[M21]M2 ...

  5. matlab矩阵相乘没有负数,关于matlab中矩阵与逆矩阵为何相乘不等于单位阵的问题...

    当我们用matlab计算矩阵和逆矩阵时,结果往往不等于单位阵 如下: >> a=magic(4) a = 16     2     3    13 5    11    10     8 ...

  6. MATLAB:矩阵 矩阵的秩,矩阵的逆矩阵,矩阵的转置,矩阵每个元素减一,矩阵元素变换

    1.矩阵 A=[1,2,3;4,5,6;7,8,9]/A=[1 2 3;4 5 6;7 8 9](分号与空格用于区分每行之间的元素,分号区分行) 2.矩阵每个元素减一 B=A-1 3.矩阵元素变换 需 ...

  7. 求4x4 矩阵的逆矩阵

    // 求4x4 矩阵的逆矩阵--macrobright int matrixInverse44(double matrix_base[], double matrix_inv[]) {     dou ...

  8. 关于matlab中矩阵与逆矩阵为何相乘不等于单位阵的问题

    当我们用matlab计算矩阵和逆矩阵时,结果往往不等于单位阵 如下: >> a=magic(4) a = 16     2     3    13      5    11    10   ...

  9. 程序员的自我修养之数学基础04:特殊矩阵(零矩阵、单位矩阵、对角矩阵、逆矩阵、转置矩阵、对称矩阵)

    零矩阵 零矩阵就是所有元素都是0的矩阵,一般记做O.可以在后面加 m,n 表示其规模. 在前一章,我们讲到,矩阵就是映射.零矩阵,就表示了将所有的点都映到原点的映射. 因此,对于任意向量 x,都有 O ...

  10. 第四节、逆矩阵与转置矩阵

    一.关于逆元 (这里看不懂可以跳过) 在群论中有"逆元"这一概念. 提到逆元就要提到另一个概念:单位元(幺元,Identity). 我们依次来介绍,简单来说,设G是一个非空集合,@ ...

最新文章

  1. 性能测试中传——lr理论基础(四)
  2. Liunx 查看硬件信息
  3. 一个程序员的感慨的《虚拟光驱》
  4. MySQL · 物理备份 · Percona XtraBackup 备份原理
  5. [转]Insert, Update, and Delete Destination table with SSIS
  6. mysql myisam key_buffer_size_MyISAM中key_buffer_size的设置_MySQL
  7. GdiPlus[29]: IGPPen: 虚线样式
  8. python语言中print函数的作用_python中print()方法有什么
  9. java calendar 2月份_Java Calendar类使用总结
  10. log4j+flume+HDFS实现日志存储
  11. ios13 文件 连接服务器 您已离线,iOS13,终于可以屏蔽系统更新了
  12. Jensen不等式证明
  13. Unity UGUI坐标和世界坐标转化
  14. UNCODE 与 ANSI 编码互相转换
  15. 用EasySysprep封装Win7系统
  16. web测试-WEB常用测试用例集
  17. TikTok账号运营:零播放、被限流的3大原因,手把手教你检测技巧和处理方法
  18. C++ 数据结构(三)列表(3)有序列表
  19. 微信登入,获取用户信息
  20. 强化学习4——基于Actor-Critic的自适应PID控制器设计

热门文章

  1. ListView分页显示
  2. android listview表格分页显示,android实现listview分页的方法
  3. 群联MPALL v3.23.00量产工具(可刷PS2251-50固件)
  4. 优盘中发现计算机病毒怎么办,u盘中毒了文件夹被病毒隐藏怎么办?
  5. 金山文字 职称计算机,计算机职称考试金山文字2005考试大纲
  6. java struts2教程_Struts2教程--第一章 搭建Struts2开发环境
  7. c语言作业朱鸣华,C语言程序设计习题解析与上机指导 第3版
  8. 怎样区别7290喷壳机与原壳黑莓手机,里面有详图
  9. 企业微信对接金蝶云星空单据模板-日常费用报销
  10. 戴尔微型计算机7060,戴尔 Dell OptiPlex 7060 微型机 :1 升的迷你小钢炮