文档章节

3D数学 ---- 矩阵的更多知识(3)

rise-worlds
 rise-worlds
发布于 2016/06/20 13:11
字数 1392
阅读 1
收藏 0

正交矩阵的运算法则

若方阵M是正交的,则当且仅当M与它转置矩阵MT的乘积等于单位矩阵,见公式9.8:

矩阵乘以它的逆等于单位矩阵:M M-1 = I

所以,如果一个矩阵是正交的,那么它的转置等于它的逆:

这是一条非常有用的性质,因为在实际应用中经常需要计算矩阵的逆,而3D图形计算中正交矩阵出现又是如此频繁。比如旋转和镜像矩阵是正交的,如果知道矩阵是正交的,就可以完全避免计算逆矩阵了,这也将大大减少计算量。

 

正交矩阵的几何解释

正交矩阵对我们非常有用,因为很容易计算它的逆矩阵。但怎样知道一个矩阵是否正交,以利用它的性质呢?

很多情况下,我们可以提前知道矩阵是如何建立的,甚至了解矩阵是仅包含旋转、镜像呢,还是二者皆有(记住:旋转和镜像矩阵是正交的)。这种情况非常普遍。

如果无法提前清楚矩阵的某些情况呢?换句话说,对于任意矩阵M,怎样检测它是否正交?为了做到这一点,让我们从正交矩阵的定义开始,以3x3阶矩阵为例。设M是3x3矩阵,根据定义,当且仅当 M MT = IM是正交的。它的确切含义如下:

现在做一些解释:

(1)当且仅当一个向量是单位向量时,它与自身的点积结果是1。因此,仅当r1r2r3是单位向量时,第1、5、9式才能成立。

(2)当且仅当两个向量是互相垂直时,它们的点积为0。因此,仅当r1r2r3互相垂直时其他等式才成立。

所以,若一个矩阵是正交的,它必须满足下列条件:

矩阵的每一行都是单位向量,矩阵的所有行互相垂直。

对矩阵的列也能得到类似的条件,这使得以下结论非常清楚:如果M是正交的,则MT也是正交的。

计算逆矩阵时,仅在预先知道矩阵是正交的情况下才能利用正交性的优点。如果预先不知道,那么检查正交性经常是浪费时间。即使在最好的情况下,先检查正交性以确定矩阵是否正交再进行转置,和一开始就进行求逆运算也将耗费同样多的时间。而如果矩阵不是正交,那么这种检查完全是浪费时间。

注意,有一个术语上的差别可能会导致轻微的混淆。线性代数中,如果一组向量互相垂直,这组向量就被认为是正交基(orthogonal basis)。它只要求所有向量互相垂直,并不要求所有向量都是单位向量。如果它们都是单位向量,则称它们为标准正交基(orthogonal basis)。这里所讲的正交矩阵的行或列向量都是指标准正交基向量(orthogonal basis vectors),所以由一组正交基向量构造的矩阵并不一定是正交矩阵(除非基向量是标准正交的)。

 

矩阵正交化

有时可能会遇到略微违反了正交性的矩阵。例如,可能从外部得到了坏数据,或者是浮点运算的累积错误(称作”矩阵爬行“)。这些情况下,需要做矩阵正交化,得到一个正交矩阵,这个矩阵要尽可能地和原矩阵相同(至少希望是这样)。

构造一组正交基向量(矩阵的行)的标准算法是施密特正交化。它的基本思想是,对每一行,从中减去它平行于已处理过的行的部分,最后得到垂直向量。

以3x3矩阵为例,和以前一样,用r1r2r3代表3x3阶矩阵M的行。正交向量组r1'r2'r3'的计算如公式9.9所示:

现在r1'r2'r3'互相垂直了,它们是一组正交基。当然,它们不一定是单位向量。构造正交矩阵需要使用标准正交基,所以必须标准化这些向量。注意,如果一开始就进行标准化,而不是在第2步中做,就能避免所有除法了。

施密特正交化是有偏差的,这取决于基向量列出的顺序。一个明显的例子是,r1总不用改变。该算法的一个改进是不在一次正交化过程中将整个矩阵完全正交化。而是选择一个小的因子k,每次只减去投影的k倍,而不是一次将投影全部减去。改进还体现在,在最初的轴上也减去投影。这种方法避免了因为运算顺序不同带来的误差。算法总结如下:

该算法的每次迭代都会使这些基向量比原来的基向量更为正交化,但可能不是完全正交的,多次重复这个过程,最终将得到一组正交基。要得到完美的结果,就得选择一个适当的因子k并迭代足够多次(如:10次)。接着,进行标准化,最后就会得到一组正交基。

本文转载自:http://www.cnblogs.com/flying_bat/archive/2008/01/17/1042691.html

rise-worlds

rise-worlds

粉丝 3
博文 1755
码字总数 0
作品 0
深圳
程序员
私信 提问
Lesson6 矩阵变换,模型,视图,投影和viewport

前言 本来打算直接写教程 04 的,但是想到3D 变换涉及的数学知识较多,往往是很多初学者的拦路虎(比如我自己)。再加上OpenGL ES 2.0 不再提供OpenGL ES 1.0中 3D 变换相关的一些重量级函数...

gdxz110
2016/11/03
67
0
unity3d 数学基础与数学辅助类

------------------------------------------------------------- 转载注明smartdot:http://my.oschina.net/u/243648/blog/67193 1. 数学(点乘/叉乘)/unity3d的数学辅助类 2. 坐标系统(本......

Matrix4X4
2012/07/15
12K
1
Metal入门资料006-MetalKit第五部分

写在前面: 对Metal技术感兴趣的同学,可以关注我的专题:Metal专辑 也可以关注我个人的简书账号:张芳涛 所有的代码存储的Github地址是:Metal 正文 上次我们描述了(图形管道)和(Metal管道)...

张芳涛
2018/06/11
0
0
OpenGL入门6:矩阵与变换

本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 近况 心酸 前言 在阅读本篇博客之前,你必须对向量和矩阵...

zhxmdefj
07/30
0
0
文章-编程需要知道多少数学知识?

本文转自:编程需要知道多少数学知识?-唐小娟的翻译 下面是我在Reddit的子论坛 r/learnprogramming 看到的几个帖子: “要成为一个优秀的程序员需要学习多少数学?” “我应该重新学习数学吗...

BjarneCpp
2017/08/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
40分钟前
3
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
4
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部