精华内容
下载资源
问答
  • 2018.04.08采纳率:41%等级:12已帮助:7379人format long e计算都是以最高精度计算的,还好你只是要改变显示精度:)-------------------------以下引用---------------------------------------如何控制matlab中的...

    满意答案

    dcebd7a0de6265b6ccae5ead692f1eab.png

    w5165688189

    推荐于 2018.04.08

    dcebd7a0de6265b6ccae5ead692f1eab.png

    采纳率:41%    等级:12

    已帮助:7379人

    format long e

    计算都是以最高精度计算的,还好你只是要改变显示精度:)

    -------------------------以下引用---------------------------------------

    如何控制matlab中的数据输出格式? 改变输出位数精度

    一. 命令方法

    针对数据的显示形式控制,matlab中有专用命令 format

    但该命令不影响数据的储存形式和计算精度

    format 默认格式

    format short 5字长定点数

    format long 15字长定点数

    format short e 5字长浮点数

    format long e 15字长浮点数

    format short g

    format long g

    format hex 16进制

    format bank 定点货币形式

    format rat 小数分数表示

    format + +,-,空格

    format compact 压缩空格

    format loose 包括空格和空行

    format long 15字长定点数

    format short e 5字长浮点数

    format long e 15字长浮点数

    format short g

    format long g

    format hex 16进制

    format bank 定点货币形式

    format rat 小数分数表示

    format + +,-,空格

    format compact 压缩空格

    format loose 包括空格和空行

    二. 菜单方式

    当然也可以不用format 命令,可以修改系统的默认设置格式,File->Preferences->Command Window->Text Display.

    如果想得到分数可以用rats()函数

    如果想得到根号,只有用符号表示了,当然用符号表示是万能的。例如:

    a=1/3 得到 0.33333

    rats(a) 得到 1/3

    a='sqrt(3)' 得到 sqrt(3) 不过这是字符型,要转换成数值型可以用eval(a),或str2num(a).

    但是无论Matlab中采取什么样的输出格式,在系统内核中的变量的精度总是保持精确的(尽可能)。除非你人为的改变它的计算精度。我们可以用一个简单的例子来说明这个问题:如a=1/3 显示为0.33333333

    a=a*3 得到 1 (不是0.99999999)

    在很多其它的程序设计语言中是不可能得到1的。这就说明了Matlab在计算的过程中不会损失用户的计算信息(包括中间结果)。

    00分享举报

    展开全文
  • % 求a22的代数余子式,那么就需要第二行,第二列的元素都删除 row=2; % 改这两个数字就可以了, column=2; a(row,:)=[]; a(:,column)=[]; det(a) result a = 1 2 3 4 5 6 7 8 9 8 7 6 8 7 6 5 ...

         matlab : R2018a 64bit
          OS : Windows 10 x64
    typesetting : Markdown
           blog : my.oschina.net/zhichengjiu
          gitee : gitee.com/zhichengjiu

    各阶主子式

    code

    clear
    clc
    
    a=[1 2 3;4 5 6;6 7 8]
     
    n=input('几阶主子式:');
     
    b=a(1:n,1:n);
     
    det(b)
    
    

    result

    
    a =
    
         1     2     3
         4     5     6
         6     7     8
    
    几阶主子式:2
    
    ans =
    
        -3
    
    >> 
    

    余子式

    code

    clear
    clc
    
    a=[1 2 3 4;5 6 7 8;9 8 7 6;8 7 6 5]
     
    % 求a22的代数余子式,那么就需要第二行,第二列的元素都删除
     
    row=2;    % 改这两个数字就可以了,
    column=2;
     
    a(row,:)=[];
    a(:,column)=[];
     
    det(a)
    
    

    result

    
    a =
    
         1     2     3     4
         5     6     7     8
         9     8     7     6
         8     7     6     5
    
    
    ans =
    
       4.5149e-15
    
    >> 
    

    代数余子式

    code

    clear
    clc
    
    a=[1 2 3 4;5 6 7 8;9 8 7 6;8 7 6 5]
     
    % 要求a22的代数余子式,那么需要第二行、第二列的元素都删除
     
    row=2;    % 改这两个数字就可以了,
    column=3;
     
    a(row,:)=[];
    a(:,column)=[];
     
    n=row+column;
    det(a)*((-1)^n)
    
    

    result

    
    a =
    
         1     2     3     4
         5     6     7     8
         9     8     7     6
         8     7     6     5
    
    
    ans =
    
      -8.7338e-15
    
    >> 
    

    resource

    • [文档] ww2.mathworks.cn/help/matlab
    • [文档] ww2.mathworks.cn/help/simulink
    • [平台] www.oschina.net
    • [平台] gitee.com


    感谢帮助 志成就 的人们。
    matlab优秀,值得学习。基础知识 + 专业知识 + matlab = ?
    Simulink,用于仿真和基于模型的设计,值得学习。
    该博文仅可用于测试与参考。

    转载于:https://my.oschina.net/zhichengjiu/blog/3012681

    展开全文
  • 文章目录逆矩阵-inverse matrix行列式-determinant伴随矩阵-adjugate、adjoint matrix余子式-Cofactor、Minor余子项余子式代数余子式-Algebraic cofactor、Minor伴随矩阵-二维的例子References LearnGL - 学习笔记...


    LearnGL - 学习笔记目录

    本人才疏学浅,如有什么错误,望不吝指出。

    上些篇:

    这一篇:了解 行列式(determinant)逆矩阵(inverse)伴随矩阵(adjugate、adjoint)余子式(cofactor、minor)代数余子式(algebraic cofactor、minor)


    逆矩阵-inverse matrix

    在计算机3D图形学中,在实现一些特殊功能的时候,特别是一些坐标还原,或重构成其他坐标时,都可能会用到逆矩阵。

    一个变换矩阵可以将我们传入的向量(组)变换到此变换矩阵中的另一个坐标系中,如果我们要撤销这些变换呢,那么就需要逆过来变换,这个逆变换的矩阵,就叫:逆矩阵。

    我们都知道,标量乘以标量,如: 1 × n = n 1 \times n = n 1×n=n,就是1乘以任意数,等于那个数的本身。

    同样在矩阵中也有类型的,如: I ⋅ M = M I\cdot M=M IM=M I I I是单位矩阵(左上角到右下角都是1,其余都是0的方阵)乘以任意矩阵都等于那个矩阵的本身。

    1 × n = n 1 \times n = n 1×n=n,同是 1 n ⋅ n = 1 \frac{1}{n}\cdot n=1 n1n=1,而这个 1 n \frac{1}{n} n1就是n的倒数。

    同样的也有: M − 1 ⋅ M = M ⋅ M − 1 = I M^{-1}\cdot M=M \cdot M^{-1}=I M1M=MM1=I,而这其中的 M − 1 M^{-1} M1就是 M M M的逆矩阵。

    在求逆矩阵时,需要用到行列式的功能。


    行列式-determinant

    先来讲一下,determinant - 矩阵行列式(这里我觉得中文翻译的理解不好),为啥要一个“式”字结尾,感觉会误导很多人,可以参考这篇文章的讲解:行列式determinant到底是个啥?,其实 determinant 就是求一个矩阵的N个轴(N个列向量,N>0,范围:1,2,…,n)围起来的空间大小(一维)、面积(二维)、体积(三维)、无法描述的变换空间大小(大于三维),最终的值是一个标量,注意:行列式结果是一个标量,并不是什么式子、也不是向量。

    所以可以理解,它就是表述一个变换的包围空间的大小。

    变换:

    • 一维中,假设一个2,就是可以把某个东西可以变大2倍的变换数值,它的determinant就是2,长度。
    • 二维中,假设 x → ( 0.5 , 0 ) y → ( 0 , 2 ) \overrightarrow x(0.5,0) \overrightarrow y(0,2) x (0.5,0)y (0,2),就是可以让一个存在于二维下的数值对象(a,b)可以让它在 x → ( 0.5 , 0 ) y → ( 0 , 2 ) \overrightarrow x(0.5,0) \overrightarrow y(0,2) x (0.5,0)y (0,2) 的变换后的结果: [ x → y → ∣ ∣ ] ⋅ ( a b ) → [ 0.5 0 0 2 ] ⋅ ( a b ) = ( 0.5 ⋅ a 2 ⋅ b ) \begin{bmatrix} \overrightarrow x & \overrightarrow y\\ |&| \end{bmatrix} \cdot \left(\begin{matrix}a\\b\end{matrix}\right) \rightarrow \begin{bmatrix} 0.5 & 0 \\ 0 & 2 \end{bmatrix} \cdot \left(\begin{matrix}a\\b\end{matrix}\right) = \left(\begin{matrix}0.5\cdot a\\2\cdot b\end{matrix}\right) [x y ](ab)[0.5002](ab)=(0.5a2b),相当于把a缩小一倍,b放大一倍。它的determinant就是0.5*2=1面积。
    • 同理三维中的是体积。

    但上面都是比较理想的变换矩阵,就是他们的每列向量之间都是垂直的(正交的)所以求他们围起来空间,直接向量它们的向量长度就可以了。

    但是如果他们不是垂直的(正交的),这个时候就需要将每个轴之间x,y,z分量上有参差的量围成的空间给减去,才能得到最终的空间。
    在这里插入图片描述

    如上图,a(a1,a2),b(b1,b2)向量就是不互相垂直的,黄色就是a(a1,a2)与b(b1,b2)向量x,y分量上参差的分量围起来的面积,着黄色部分的面积就是整个长方形需要减去的面积,最终得到的面积就是a,b向量围起来的平行四边形的面积。

    也可以从百度百科中的:矩阵行列式的公式: d e t ( a b c d ) = a d − b c det\left(\begin{matrix} a & b \\ c & d \end{matrix}\right) =ad-bc det(acbd)=adbc 来发现一些线索。

    如果b,c为零呢? d e t ( a b c d ) = a d − b c → d e t ( a 0 0 d ) = a d − 0 = a d det\left(\begin{matrix} a & \color{#ff0000}b \\ \color{#ff0000}c & d \end{matrix}\right) =ad-{\color{#ff0000}bc}\rightarrow det\left(\begin{matrix} a & \color{#ff0000}0 \\ \color{#ff0000}0 & d \end{matrix}\right) =ad-{\color{#ff0000}0}=ad det(acbd)=adbcdet(a00d)=ad0=ad,那就是向量(a,0)与向量(0,d)垂直了,前者平行于x轴,后者平行于y轴,这时面积就等于ad了,如下图
    在这里插入图片描述在这里插入图片描述

    所以 行列式就是求变换矩阵的轴包围的一个空间大小,只不过在这个二维空间单位是面积,三维就是体积了,一维就是长度。

    假设有矩阵A: [ a b c d ] \begin{bmatrix} a & b\\ c & d \end{bmatrix} [acbd]

    det(A),或是矩阵A的行列式 又或是记作 ∣ A ∣ |A| A,那么: d e t ( A ) = ∣ A ∣ = a d − b c det(A)=|A|=ad-bc det(A)=A=adbc

    那么矩阵A的逆矩阵,记作 A − 1 A^{-1} A1,那么 A − 1 = 1 ∣ A ∣ ⋅ [ d − b − c a ] = 1 a d − b c ⋅ [ d − b − c a ] A^{-1}=\frac{1}{|A|}\cdot\begin{bmatrix}d & -b \\ -c & a\end{bmatrix}=\frac{1}{ad-bc}\cdot\begin{bmatrix}d & -b \\ -c & a\end{bmatrix} A1=A1[dcba]=adbc1[dcba]

    暂且我们不管这个矩阵 [ d − b − c a ] \begin{bmatrix}d & -b \\ -c & a\end{bmatrix} [dcba]是怎么来的,它看起来就像是a与d交换,b,c添加负数了。这个矩阵叫作:伴随矩阵。后面再详细的搬运一波内容。

    这个是2X2矩阵的逆矩阵,我们可以验证一下:


    那么继续逆矩阵的内容

    有一个矩阵A:
    A = [ a b c d ] = [ 8 − 2 4 6 ] A=\begin{bmatrix}a & b \\ c & d\end{bmatrix}=\begin{bmatrix}8 & -2 \\ 4 & 6\end{bmatrix} A=[acbd]=[8426]

    A的逆矩阵为:
    A − 1 = 1 a d − b c ⋅ [ d − b − c a ] A^{-1}=\frac{1}{ad-bc}\cdot\begin{bmatrix}d & -b \\ -c & a\end{bmatrix} A1=adbc1[dcba]
    A − 1 = 1 8 ⋅ 6 − ( − 2 ) ⋅ 4 ⋅ [ 6 − ( − 2 ) − 4 8 ] A^{-1}=\frac{1}{8\cdot 6-(-2)\cdot 4}\cdot\begin{bmatrix}6 & -(-2) \\ -4 & 8\end{bmatrix} A1=86(2)41[64(2)8]
    A − 1 = 1 48 + 8 ⋅ [ 6 2 − 4 8 ] A^{-1}=\frac{1}{48+8}\cdot\begin{bmatrix}6 & 2 \\ -4 & 8\end{bmatrix} A1=48+81[6428]
    A − 1 = 1 56 ⋅ [ 6 2 − 4 8 ] A^{-1}=\frac{1}{56}\cdot\begin{bmatrix}6 & 2 \\ -4 & 8\end{bmatrix} A1=561[6428]
    A − 1 = [ 6 ⋅ 1 56 2 ⋅ 1 56 − 4 ⋅ 1 56 8 ⋅ 1 56 ] A^{-1}=\begin{bmatrix}6\cdot \frac{1}{56} & 2 \cdot \frac{1}{56} \\ -4 \cdot \frac{1}{56} & 8 \cdot \frac{1}{56}\end{bmatrix} A1=[6561456125618561]
    A − 1 = [ 6 56 2 56 − 4 56 8 56 ] A^{-1}=\begin{bmatrix}\frac{6}{56} & \frac{2}{56} \\ -\frac{4}{56} & \frac{8}{56}\end{bmatrix} A1=[566564562568]

    OK,现在计算得 A − 1 = [ 6 56 2 56 − 4 56 8 56 ] A^{-1}=\begin{bmatrix}\frac{6}{56} & \frac{2}{56} \\ -\frac{4}{56} & \frac{8}{56}\end{bmatrix} A1=[566564562568],然将与 A = [ 8 − 2 4 6 ] A=\begin{bmatrix}8 & -2 \\ 4 & 6\end{bmatrix} A=[8426]相乘,结果看看是否等于 I I I

    A − 1 ⋅ A = I A^{-1}\cdot A = I A1A=I

    [ 6 56 2 56 − 4 56 8 56 ] ⋅ [ 8 − 2 4 6 ] = [ 1 0 0 1 ] \begin{bmatrix}\frac{6}{56} & \frac{2}{56} \\ -\frac{4}{56} & \frac{8}{56}\end{bmatrix} \cdot \begin{bmatrix}8 & -2 \\ 4 & 6\end{bmatrix}=\begin{bmatrix}1 & 0 \\ 0 & 1\end{bmatrix} [566564562568][8426]=[1001]

    [ 6 ⋅ 8 56 + 2 ⋅ 4 56 6 ⋅ ( − 2 ) 56 + 2 ⋅ 6 56 − 4 ⋅ 8 56 + 8 ⋅ 4 56 − 4 ⋅ ( − 2 ) 56 + 8 ⋅ 6 56 ] = [ 1 0 0 1 ] \begin{bmatrix}\frac{6 \cdot 8}{56} + \frac{2 \cdot 4}{56} & \frac{6 \cdot (-2)}{56} + \frac{2 \cdot 6}{56} \\ -\frac{4\cdot 8}{56} + \frac{8\cdot 4}{56} & -\frac{4\cdot (-2)}{56} + \frac{8 \cdot 6}{56}\end{bmatrix} =\begin{bmatrix}1 & 0 \\ 0 & 1\end{bmatrix} [5668+56245648+5684566(2)+5626564(2)+5686]=[1001]

    [ 48 56 + 8 56 − 12 56 + 12 56 − 32 56 + 32 56 8 56 + 48 56 ] = [ 1 0 0 1 ] \begin{bmatrix}\frac{48}{56} + \frac{8}{56} & \frac{-12}{56} + \frac{12}{56} \\ -\frac{32}{56} + \frac{32}{56} & \frac{8}{56} + \frac{48}{56}\end{bmatrix} =\begin{bmatrix}1 & 0 \\ 0 & 1\end{bmatrix} [5648+5685632+56325612+5612568+5648]=[1001]

    [ 56 56 0 0 56 56 ] = [ 1 0 0 1 ] \begin{bmatrix}\frac{56}{56} & 0 \\ 0 & \frac{56}{56}\end{bmatrix} =\begin{bmatrix}1 & 0 \\ 0 & 1\end{bmatrix} [5656005656]=[1001]

    [ 1 0 0 1 ] = [ 1 0 0 1 ] \begin{bmatrix}1& 0 \\ 0 & 1\end{bmatrix} =\begin{bmatrix}1 & 0 \\ 0 & 1\end{bmatrix} [1001]=[1001]

    OK,计算完毕。反过来的: A ⋅ A − 1 = I A\cdot A^{-1} = I AA1=I也是一样的。

    还有另一个中计算:Matrix Inverse – 逆矩阵,这种方式可视化是以行向量来分析求解的。

    而我们上面使用的是列,建议使用列的方式,更加贴合各种软件中计算。


    矩阵的逆矩阵不一定存在,由几种方式可以判断来,先看看二维的逆矩阵的公式:
    A − 1 = 1 ∣ A ∣ ⋅ [ d − b − c a ] = 1 a d − b c ⋅ [ d − b − c a ] A^{-1}=\frac{1}{|A|}\cdot\begin{bmatrix}d & -b \\ -c & a\end{bmatrix}=\frac{1}{ad-bc}\cdot\begin{bmatrix}d & -b \\ -c & a\end{bmatrix} A1=A1[dcba]=adbc1[dcba]

    此公式中: d e t ( A ) = ∣ A ∣ = a d − b c det(A)=|A|=ad-bc det(A)=A=adbc

    如果 ∣ A ∣ = 0 |A|=0 A=0,那么这个式子就 A − 1 A^{-1} A1的公式中会有除以 0 0 0而无意义。

    因为 ∣ A ∣ = a d − b c = 0 |A|=ad-bc=0 A=adbc=0,所以 A − 1 A^{-1} A1矩阵有无意义,会是否存在,取决于 A A A矩阵列向量的值。

    如果细心观察,可以看出: A = [ a b c d ] A=\begin{bmatrix}a & b\\c & d\end{bmatrix} A=[acbd],矩阵 A A A的第一列向量是: [ a c ] \begin{bmatrix}a\\c\end{bmatrix} [ac],第二列向量是: [ b d ] \begin{bmatrix}b\\d\end{bmatrix} [bd],而 ∣ A ∣ = a d − b c |A|=ad-bc A=adbc,其实就是:两列向量的叉乘: [ a c ] × [ b d ] = a d − b c \begin{bmatrix}a\\c\end{bmatrix} \times \begin{bmatrix}b\\d\end{bmatrix}=ad-bc [ac]×[bd]=adbc

    两个非零向量叉乘的结果为0的时候就只有这两个向量是:相同方向,或是相反方向的,即:两向量平行。

    所以如果一个二维变换矩阵的列向量如果向量是共线的,那么该矩阵就没有逆矩阵。

    而按行列式,或是determinant的理解就是:如果一个二维变换矩阵的行列式为0,就是变换矩阵的基围起来的空间大小为0(这里的大小至少是面积、体积,或以上),那么此变换矩阵没有逆矩阵。

    所以在判断二维矩阵的逆矩阵是否存在,可以根据以下几种方式:

    • 用式子来总结: A − 1 = 1 ∣ A ∣ ⋅ [ d − b − c a ] A^{-1}=\frac{1}{|A|}\cdot\begin{bmatrix}d & -b \\ -c & a\end{bmatrix} A1=A1[dcba],当 ∣ A ∣ = 0 |A|=0 A=0,则 A − 1 A^{-1} A1无意义,则 A A A的逆矩阵 A − 1 A^{-1} A1不存在。
    • 而: ∣ A ∣ = 0 |A|=0 A=0,也代表: a d − b c = 0 ad-bc=0 adbc=0,也代表: a d = b c ad=bc ad=bc,也代表: a b = c d \frac{a}{b}=\frac{c}{d} ba=dc,则 A A A不存在逆矩阵。
    • 而: a b = c d \frac{a}{b}=\frac{c}{d} ba=dc,也可以看成是: k = a b = c d k=\frac{a}{b}=\frac{c}{d} k=ba=dc,类似直线斜率的方式,就像 Matrix Inverse – 逆矩阵 中最后是以 [ a b c d ] \begin{bmatrix}\color{#ff0000}a & \color{#ff0000}b \\ \color{#00ff00}c & \color{#00ff00}d\end{bmatrix} [acbd]中的量行的数值分别当作是直线的斜率: a b = c d {\color{#ff0000}\frac{a}{b}}={\color{#00ff00}\frac{c}{d}} ba=dc,则 A A A也不存在逆矩阵。
    • 而: a d = b c ad=bc ad=bc,除了可以推导出: k = a b = c d k=\frac{a}{b}=\frac{c}{d} k=ba=dc,也一样可以按: a c = c b \frac{a}{c}=\frac{c}{b} ca=bc来判断,这样就是列向量当作直线,并比较它们两的斜率。

    上面的直线斜率的方式,可以以这种方式来看待矩阵,就像是直线方程组,把矩阵的元素当作是方程组中的系数:
    [ a b c d ] ⋅ [ x y ] = [ e f ] \begin{bmatrix} a & b\\ c & d \end{bmatrix} \cdot \begin{bmatrix} x\\ y \end{bmatrix} =\begin{bmatrix} e\\ f \end{bmatrix} [acbd][xy]=[ef]

    它其实就是:
    [ a c ] ⋅ x + [ b d ] ⋅ y = [ e f ] \begin{bmatrix} a \\ c \end{bmatrix} \cdot x + \begin{bmatrix} b \\ d \end{bmatrix} \cdot y =\begin{bmatrix} e\\ f \end{bmatrix} [ac]x+[bd]y=[ef]

    写成:
    a x + b y = e a x + d y = f ax + by = e\\ ax + dy = f ax+by=eax+dy=f

    变形以下:
    b y = − a x + e d y = − a x + f by = -ax + e\\ dy = -ax + f by=ax+edy=ax+f
    再变形:
    y = − a b x + e b y = − a d x + f d y = -\frac{a}{b}x + \frac{e}{b}\\ y = -\frac{a}{d}x + \frac{f}{d} y=bax+bey=dax+df

    OK,在看看,这个与我们的直线方程的: y = k x + b y = kx + b y=kx+b,是否很像?

    所以我们可以把: k : − a b = − a d k:-\frac{ a}{b}=-\frac{a}{d} kba=da,看作是斜率,然后等式两边的符号,就成了: k : a b = a d k:\frac{ a}{b}=\frac{a}{d} kba=da

    然后是直线的上下位移量: b : e b = f d b:\frac{e}{b}=\frac{f}{d} bbe=df,但是直线方程上的 b b b不影响行列式,因为 b b b只会影响直线之间是重叠共线还是平行。

    所以两个直线的斜率 k k k 相等了,就平行或共线了,那么矩阵的行列式就为0,那么也就不存在逆矩阵了。

    还可以理解为直线方程组的各项未知数(元)的系数的话,那么说明两直线无x,y的解,此直线方程无根。因为他们是共线(无穷个交点,无穷个解)或平行(一个交点都没有,一个解都没有)了。两条直线方程有解的话,说明有一个x,y点是两条直线的交点。

    这类 n n n阶方阵的矩阵如果 不存在 逆矩阵(determinant行列式 0),则称为:奇异 矩阵。

    矩阵如果 存在 逆矩阵(determinant行列式 不为 0),则称为:非奇异 矩阵。

    也可以参考百度百科的:奇异矩阵,奇异矩阵也叫:singular matrix

    最后附上形象一些的图像:
    在这里插入图片描述

    可以看到,当矩阵中的两列向量在共线后,四边形的面积就为0了(紫色的区域大小为0),也就是行列式为0,那么这样的矩阵是没有逆矩阵的。


    伴随矩阵-adjugate、adjoint matrix

    伴随矩阵英文叫:adjugate matrix,也叫 adjoint matrix。

    也可参考百度百科中说明:伴随矩阵

    早在之前的其他文章中有表述过,数学是需要很高洞察力的学科,需要去观察它的规律。

    然后聪明的人类发明了数学公式符号来表示这些规律,如:斐波那契数列、对数,指数,三角函数,等等,等等,这些都有一些简洁的公式,这里就不一一搬砖了,可自行搜索。

    而伴随矩阵也是被这些数学家们发现了它的特性,它的作用,也可以用于计算出逆矩阵而用的。
    (这里我猜测是数学家们先计算出了逆矩阵的方法,可能计算过程太过于繁琐,然后提炼到最精简的结果时,发现了这一结果是可以从现有矩阵中的数值来求出来的,但它到底是怎么被发现的,这一历史没有记录,我也搜索不到,但这些过程是非常有参考意义的,我也惊讶于竟然没有记录,如果有记录的话,会对后人可能有更多的理解,或是更多特性的发现)

    下面我引用百度百科中的一句:

    如果二维矩阵可逆,那么它的逆矩阵和它的伴随矩阵之间只差一个系数,对多维矩阵也存在这个规律。

    照搬一下之前的求矩阵 A A A的逆矩阵的公式:

    A − 1 = 1 ∣ A ∣ ⋅ [ d − b − c a ] = 1 a d − b c ⋅ [ d − b − c a ] A^{-1}=\frac{1}{|A|}\cdot\begin{bmatrix}d & -b \\ -c & a\end{bmatrix}=\frac{1}{ad-bc}\cdot\begin{bmatrix}d & -b \\ -c & a\end{bmatrix} A1=A1[dcba]=adbc1[dcba]

    矩阵 [ d − b − c a ] \begin{bmatrix}d & -b \\ -c & a\end{bmatrix} [dcba] 就是伴随矩阵。

    留意上面引用百度百科说的,它(伴随矩阵)与逆矩阵就差一个系数,这个系数就是:determinant的倒数,即:矩阵行列式的倒数: 1 d e t ( A ) = 1 ∣ A ∣ \frac{1}{det(A)}=\frac{1}{|A|} det(A)1=A1二维中(或说是二阶方阵) 的这个系数就是: 1 a d − b c \frac{1}{ad-bc} adbc1

    就像上面所说的,至于这个伴随矩阵是怎么得来的,之前我只是简单的描述的一下:

    矩阵 [ d − b − c a ] \begin{bmatrix}d & -b \\ -c & a\end{bmatrix} [dcba]是怎么来的,它看起来就像是a与d交换,b,c添加了负数

    这是我个人观察的规律,但其实它是由一段公式计算出来的,只不过二维矩阵的伴随矩阵比较简单的规律。

    但如果要计算N维(或说N阶)矩阵时,还是需要用公式来计算好些,因为大于二维以上的矩阵的伴随矩阵的计算复杂度会越来越大。

    说是有一个公式可以算出来的,但伴随矩阵的式子又是怎么来的,我们也不知道,查找的资料中没有收录这方面的信息,它的公式是:

    矩阵 A A A的伴随矩阵,记作: A ∗ A^* A,它的式子为:

    注意 A ∗ A^* A的每项元素做了调整从: A 行 列 A_{\red行\green列} A位置上的值调整为: A 列 行 A_{\green列\red行} A的值(注意下标左边还是表示 ,右边的还是表示 ,上面说的只是他们的转置情况)。可以理解为 伴随矩阵 处理了 转置过 的,就是 行和列对调过 的。
    A ∗ = [ A 1 1 A 1 2 ⋯ A 1 n A 2 1 A 2 2 ⋯ A 2 n ⋮ ⋮ ⋱ ⋮ A n 1 A n 2 ⋯ A n n ] A^*=\begin{bmatrix} A_{\red 1\green 1} & A_{\red 1\green 2} & \cdots & A_{\red 1\green n} \\ A_{\red 2\green 1} & A_{\red 2\green 2} & \cdots & A_{\red 2\green n} \\ \vdots & \vdots & \ddots & \vdots \\ A_{\red n\green 1} & A_{\red n\green 2} & \cdots & A_{\red n\green n} \end{bmatrix} A=A11A21An1A12A22An2A1nA2nAnn

    这是错误的,之前没有留意到这个下标不一样,导致我在后续验算是发现结果不对,-_-!!!:
    在这里插入图片描述

    下面的结果是 转置后 的,才是对的:

    A ∗ = [ A 1 1 A 2 1 ⋯ A n 1 A 1 2 A 2 2 ⋯ A n 2 ⋮ ⋮ ⋱ ⋮ A 1 n A 2 n ⋯ A n n ] A^*=\begin{bmatrix} A_{\green 1\red 1} & A_{\green 2\red 1} & \cdots & A_{\green n\red 1} \\ A_{\green 1\red 2} & A_{\green 2\red 2} & \cdots & A_{\green n\red 2} \\ \vdots & \vdots & \ddots & \vdots \\ A_{\green 1\red n} & A_{\green 2\red n} & \cdots & A_{\green n\red n} \end{bmatrix} A=A11A12A1nA21A22A2nAn1An2Ann

    在这里插入图片描述

    矩阵中的元素 A i j A_{ij} Aij代数余子式,下面会讲到。

    假设有个3x3矩阵 A A A
    A = [ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] A=\begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix} A=a11a21a31a12a22a32a13a23a33

    要求伴随矩阵,我们又要先了解下面要讲到:余子式 M i j M_{ij} Mij。后面再加以详细的搬砖。

    我们要求得矩阵 A A A的伴随矩阵就等于:它的矩阵 A A A每一项元素的 代数余子式。这里又有一个术语:代数余子式 A i j = ( − 1 ) i + j ⋅ M i j A_{ij}=(-1)^{i+j} \cdot M_{ij} Aij=(1)i+jMij(如果要我用一个表情,我会用一个:捂脸哭笑的表情)。

    余子式 M i j M_{ij} Mij代数余子式 A i j = ( − 1 ) i + j ⋅ M i j A_{ij}=(-1)^{i+j} \cdot M_{ij} Aij=(1)i+jMij 在公式上看的话,后者会多了一个符号的计算: ( − 1 ) i + j (-1)^{i+j} (1)i+j。后面在加以详细的搬砖。现在先跳过,那么继续伴随矩阵的计算:

    所以 A ∗ A^* A 中每一项 代数与字数 也等于 带符号余子式
    A ∗ = [ A 11 A 21 ⋯ A n 1 A 12 A 22 ⋯ A n 2 ⋮ ⋮ ⋱ ⋮ A 1 n A 2 n ⋯ A n n ] = [ ( − 1 ) 1 + 1 ⋅ M 11 ( − 1 ) 2 + 1 ⋅ M 21 ⋯ ( − 1 ) n + 1 ⋅ M n 1 ( − 1 ) 1 + 2 ⋅ M 12 ( − 1 ) 2 + 2 ⋅ M 22 ⋯ ( − 1 ) n + 2 ⋅ M n 2 ⋮ ⋮ ⋱ ⋮ ( − 1 ) 1 + n ⋅ M 1 n ( − 1 ) 2 + n ⋅ M 2 n ⋯ ( − 1 ) n + n ⋅ M n n ] A^*=\begin{bmatrix} A_{11} & A_{21} & \cdots & A_{n1} \\ A_{12} & A_{22} & \cdots & A_{n2} \\ \vdots & \vdots & \ddots & \vdots \\ A_{1n} & A_{2n} & \cdots & A_{nn} \end{bmatrix}=\begin{bmatrix} (-1)^{1+1}\cdot M_{11} & (-1)^{2+1}\cdot M_{21} & \cdots & (-1)^{n+1}\cdot M_{n1} \\ (-1)^{1+2}\cdot M_{12} & (-1)^{2+2}\cdot M_{22} & \cdots & (-1)^{n+2}\cdot M_{n2} \\ \vdots & \vdots & \ddots & \vdots \\ (-1)^{1+n}\cdot M_{1n} & (-1)^{2+n}\cdot M_{2n} & \cdots & (-1)^{n+n}\cdot M_{nn} \end{bmatrix} A=A11A12A1nA21A22A2nAn1An2Ann=(1)1+1M11(1)1+2M12(1)1+nM1n(1)2+1M21(1)2+2M22(1)2+nM2n(1)n+1Mn1(1)n+2Mn2(1)n+nMnn

    在我们这个3x3矩阵 A A A例子中就是(注意行列 下标转置 过的):
    A ∗ = [ A 1 1 A 2 1 A 3 1 A 1 2 A 2 2 A 3 2 A 1 3 A 2 3 A 3 3 ] A^*=\begin{bmatrix} A_{\green 1\red 1} & A_{\green 2\red 1} & A_{\green 3\red 1} \\ A_{\green 1\red 2} & A_{\green 2\red 2} & A_{\green 3\red 2} \\ A_{\green 1\red 3} & A_{\green 2\red 3} & A_{\green 3\red 3} \end{bmatrix} A=A11A12A13A21A22A23A31A32A33


    余子式-Cofactor、Minor

    余子式:英文叫:Cofactor,或:Minor,有辅助因子,或是辅助项,次级项,等意思。

    余子式它的符号记作: M i j M_{ij} Mij i i i j j j分别是第 i i i行和第 j j j列的意思, M i j M_{ij} Mij代表的就是减去第 i i i行和第 j j j列后的n-1方阵的行列式。这里先来个简述,后面会重复强调意思。

    而中文的理解中在于:“”字。然后又是令人费解的“”字。

    • 字:减去对应的的行与列之后剩余的所有项,重组的新的n-1方阵。
    • 字:教你理解这个“”子的方法,你可以把它理解成编程语言中的:表达式。而编程中的表达式最终会有一个值的,所以就是表达式,就是会得到一个的式子。(前面说的 行列式 中的“式”字也是可以这么理解的)

    因为它是从原始n方阵中,减去对应的的第 i i i行与第 j j j列之后剩余的所有项,重组的新的n-1方阵的 行列式注意它是一个余项组成而成的n-1方阵的行列式(determinant),所以它将会是一个):

    还是用回上面的个3x3矩阵 A A A

    A = [ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] A=\begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix} A=a11a21a31a12a22a32a13a23a33

    中,假设我要求第2行第1列的余子式,先分两步:

    • 先得出 余项,因为是原来的一部分的项目,所以我们叫:余子项
    • 再根据 余子项 来求这个 余子项行列式,所以简称 余子式

    余子项

    2行第1列的余子项:

    先将要删除的第2行第1列的所有项的用红色标出来:
    A = [ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] A=\begin{bmatrix} \color{#ff0000}a_{11} & a_{12} & a_{13} \\ \color{#ff0000}a_{21} & \color{#ff0000}a_{22} & \color{#ff0000}a_{23} \\ \color{#ff0000}a_{31} & a_{32} & a_{33} \end{bmatrix} A=a11a21a31a12a22a32a13a23a33

    再将这些项删除:
    A = [ 删 除 a 12 a 13 删 除 删 除 删 除 删 除 a 32 a 33 ] A=\begin{bmatrix} \color{#ff0000}删除 & a_{12} & a_{13} \\ \color{#ff0000}删除 & \color{#ff0000}删除 & \color{#ff0000}删除 \\ \color{#ff0000}删除 & a_{32} & a_{33} \end{bmatrix} A=a12a32a13a33

    删除,得到 余子项
    B 21 = [ a 12 a 13 a 32 a 33 ] B_{21}=\begin{bmatrix} a_{12} & a_{13} \\ a_{32} & a_{33} \end{bmatrix} B21=[a12a32a13a33]


    余子式

    然后是这个用这个 余子项 来来计算矩阵 B B B行列式(determinant)

    那么 余子式 记作 M i j M_{ij} Mij,我们的 i i i2 j j j1

    M 21 = d e t ( B 21 ) = [ a 12 a 13 a 32 a 33 ] = a 12 ⋅ a 33 − a 13 ⋅ a 32 M_{21}=det(B_{21})=\begin{bmatrix} \color{#ff0000}a_{12} & \color{#00aa00}a_{13} \\ \color{#00aa00}a_{32} & \color{#ff0000}a_{33} \end{bmatrix} ={\color{#ff0000}a_{12}\cdot a_{33}} - {\color{#00aa00}a_{13} \cdot a_{32}} M21=det(B21)=[a12a32a13a33]=a12a33a13a32

    然后是:其他的 M i j M_{ij} Mij都可以使用这种方法计算出对应3x3矩阵中的每一项元素的余子式。


    代数余子式-Algebraic cofactor、Minor

    我们前面说了伴随矩阵就是每一项的 代数余子式

    余子式代数余子式 的区别前面也说过,这里再重新强调一下:

    余子式 M i j M_{ij} Mij代数余子式 A i j = ( − 1 ) i + j ⋅ M i j A_{ij}=(-1)^{i+j} \cdot M_{ij} Aij=(1)i+jMij 在公式上看的话,后者会多了一个符号的计算: ( − 1 ) i + j (-1)^{i+j} (1)i+j

    那第 i = 2 i=2 i=2 j = 1 j=1 j=1 A i j = A 21 A_{ij}=A_{21} Aij=A21

    A 21 = ( − 1 ) 2 + 1 ⋅ M 21 A_{21}=(-1)^{2+1} \cdot M_{21} A21=(1)2+1M21

    A 21 = ( − 1 ) 3 ⋅ M 21 A_{21}=(-1)^{3} \cdot M_{21} A21=(1)3M21

    A 21 = − M 21 A_{21}=-M_{21} A21=M21

    那么我们将之前3x3的矩阵 A A A的每一项元素的 代数余子式 计算得出:

    (上面的矩阵 A A A跑太远了,这里再复制过来,方便阅读)
    A = [ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] A=\begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix} A=a11a21a31a12a22a32a13a23a33

    矩阵 A A A的伴随矩阵 A ∗ A^* A为每一项的 代数余字数 (注意行列 下标转置 过的):
    A ∗ = [ A 1 1 A 2 1 A 3 1 A 1 2 A 2 2 A 3 2 A 1 3 A 2 3 A 3 3 ] A^*=\begin{bmatrix} A_{\green 1\red 1} & A_{\green 2\red 1} & A_{\green 3\red 1} \\ A_{\green 1\red 2} & A_{\green 2\red 2} & A_{\green 3\red 2} \\ A_{\green 1\red 3} & A_{\green 2\red 3} & A_{\green 3\red 3} \end{bmatrix} A=A11A12A13A21A22A23A31A32A33

    因为: A i j = ( − 1 ) i + j ⋅ M i j A_{ij}=(-1)^{i+j} \cdot M_{ij} Aij=(1)i+jMij,所以式子可以调整为:

    A ∗ = [ ( − 1 ) 1 + 1 ⋅ M 11 ( − 1 ) 2 + 1 ⋅ M 21 ( − 1 ) 3 + 1 ⋅ M 31 ( − 1 ) 1 + 2 ⋅ M 12 ( − 1 ) 2 + 2 ⋅ M 22 ( − 1 ) 3 + 2 ⋅ M 32 ( − 1 ) 1 + 3 ⋅ M 13 ( − 1 ) 2 + 3 ⋅ M 32 ( − 1 ) 3 + 3 ⋅ M 33 ] A^*=\begin{bmatrix} (-1)^{1+1}\cdot M_{11} & (-1)^{2+1}\cdot M_{21} & (-1)^{3+1}\cdot M_{31} \\ (-1)^{1+2}\cdot M_{12} & (-1)^{2+2}\cdot M_{22} & (-1)^{3+2}\cdot M_{32} \\ (-1)^{1+3}\cdot M_{13} & (-1)^{2+3}\cdot M_{32} & (-1)^{3+3}\cdot M_{33} \end{bmatrix} A=(1)1+1M11(1)1+2M12(1)1+3M13(1)2+1M21(1)2+2M22(1)2+3M32(1)3+1M31(1)3+2M32(1)3+3M33

    A ∗ = [ ( − 1 ) 2 ⋅ M 11 ( − 1 ) 3 ⋅ M 21 ( − 1 ) 4 ⋅ M 31 ( − 1 ) 3 ⋅ M 12 ( − 1 ) 4 ⋅ M 22 ( − 1 ) 5 ⋅ M 32 ( − 1 ) 4 ⋅ M 13 ( − 1 ) 5 ⋅ M 23 ( − 1 ) 6 ⋅ M 33 ] A^*=\begin{bmatrix} (-1)^{2}\cdot M_{11} & (-1)^{3}\cdot M_{21} & (-1)^{4}\cdot M_{31} \\ (-1)^{3}\cdot M_{12} & (-1)^{4}\cdot M_{22} & (-1)^{5}\cdot M_{32} \\ (-1)^{4}\cdot M_{13} & (-1)^{5}\cdot M_{23} & (-1)^{6}\cdot M_{33} \end{bmatrix} A=(1)2M11(1)3M12(1)4M13(1)3M21(1)4M22(1)5M23(1)4M31(1)5M32(1)6M33

    为了对齐,我把正负号的 代数余字数+ 也标出来,因为它就是带符号的 余子式
    A ∗ = [ + M 11 − M 21 + M 31 − M 12 + M 22 − M 32 + M 13 − M 23 + M 33 ] A^*=\begin{bmatrix} +M_{11} & -M_{21} & +M_{31} \\ -M_{12} & +M_{22} & -M_{32} \\ +M_{13} & -M_{23} & +M_{33} \end{bmatrix} A=+M11M12+M13M21+M22M23+M31M32+M33


    伴随矩阵-二维的例子

    那么来计算最简单的二维矩阵,求:二维矩阵的伴随矩阵。

    就用我们前门最简单的2x2矩阵: A = [ a b c d ] A=\begin{bmatrix}a & b \\ c & d\end{bmatrix} A=[acbd],它的 伴随矩阵 是: A ∗ = [ d − b − c a ] A^*=\begin{bmatrix}d & -b \\ -c & a\end{bmatrix} A=[dcba]

    下面来看看它的 A ∗ A^* A是怎么计算得来的(注意行列 下标转置 过的):
    A ∗ = [ A 11 A 21 A 12 A 22 ] A^*=\begin{bmatrix}A_{11} & A_{21} \\ A_{12} & A_{22}\end{bmatrix} A=[A11A12A21A22]

    那看看 A 11 , A 12 , A 21 , A 22 A_{11},A_{12},A_{21},A_{22} A11,A12,A21,A22分别都是怎么计算的:

    M 11 = [ a b c d ] , 删除1行1列: M 11 = [ d ] , A 11 = ( − 1 ) 1 + 1 ⋅ M 11 = ( − 1 ) 2 ⋅ [ d ] = d M_{11} =\begin{bmatrix}\color{#ff0000}a & \color{#ff0000}b \\ \color{#ff0000}c &{\color{00dd00}d} \end{bmatrix} ,\text{删除1行1列:} M_{11} =[{\color{00dd00}d}], A_{11}=(-1)^{1+1} \cdot M_{11}=(-1)^{2} \cdot [{\color{00dd00}d}]={\color{00dd00}d} M11=[acbd],删除11列:M11=[d],A11=(1)1+1M11=(1)2[d]=d,所以 A 11 = d \color{#ff0000}A_{11}=d A11=d

    M 12 = [ a b c d ] , 删除1行2列: M 12 = [ c ] , A 12 = ( − 1 ) 1 + 2 ⋅ M 12 = ( − 1 ) 3 ⋅ [ c ] = − c M_{12} =\begin{bmatrix}\color{#ff0000}a & \color{#ff0000}b \\ {\color{00dd00}c} & \color{#ff0000}d\end{bmatrix} ,\text{删除1行2列:} M_{12} =[{\color{00dd00}c}], A_{12}=(-1)^{1+2} \cdot M_{12}=(-1)^{3} \cdot [{\color{00dd00}c}]=-{\color{00dd00}c} M12=[acbd],删除12列:M12=[c],A12=(1)1+2M12=(1)3[c]=c,所以 A 12 = − c \color{#ff0000}A_{12}=-c A12=c

    M 21 = [ a b c d ] , 删除2行1列: M 21 = [ b ] , A 21 = ( − 1 ) 2 + 1 ⋅ M 21 = ( − 1 ) 3 ⋅ [ b ] = − b M_{21} =\begin{bmatrix}\color{#ff0000}a & {\color{00dd00}b} \\ \color{#ff0000}c & \color{#ff0000}d\end{bmatrix} ,\text{删除2行1列:} M_{21} =[{\color{00dd00}b}], A_{21}=(-1)^{2+1} \cdot M_{21}=(-1)^{3} \cdot [{\color{00dd00}b}]=-{\color{00dd00}b} M21=[acbd],删除21列:M21=[b],A21=(1)2+1M21=(1)3[b]=b,所以 A 21 = − b \color{#ff0000}A_{21}=-b A21=b

    M 22 = [ a b c d ] , 删除2行2列: M 22 = [ a ] , A 22 = ( − 1 ) 2 + 2 ⋅ M 22 = ( − 1 ) 4 ⋅ [ a ] = a M_{22} =\begin{bmatrix}{\color{00dd00}a} & \color{#ff0000}b \\ \color{#ff0000}c & \color{#ff0000}d\end{bmatrix} ,\text{删除2行2列:} M_{22} =[{\color{00dd00}a}], A_{22}=(-1)^{2+2} \cdot M_{22}=(-1)^{4} \cdot [{\color{00dd00}a}]={\color{00dd00}a} M22=[acbd],删除22列:M22=[a],A22=(1)2+2M22=(1)4[a]=a,所以 A 22 = a \color{#ff0000}A_{22}=a A22=a

    OK,现在 A 11 , A 12 , A 21 , A 22 A_{11},A_{12},A_{21},A_{22} A11,A12,A21,A22都计算好了。

    分别代回伴随矩阵(注意行列 下标转置 过的): A ∗ = [ A 11 A 21 A 12 A 22 ] = [ d − b − c a ] A^*=\begin{bmatrix}A_{11} & A_{21} \\ A_{12} & A_{22}\end{bmatrix}=\begin{bmatrix}\color{#ff0000}d & \color{#ff0000}-b \\ \color{#ff0000}-c & \color{#ff0000}a\end{bmatrix} A=[A11A12A21A22]=[dcba]

    所以你会看到这个结果就是我之前说的结果。

    二维矩阵的伴随矩阵很简单,所以直接总结为之前说的简单处理:“矩阵 [ d − b − c a ] \begin{bmatrix}d & -b \\ -c & a\end{bmatrix} [dcba]是怎么来的,它看起来就像是a与d交换,b,c添加了负数

    再根据之前描述说的,伴随矩阵逆矩阵 就差一个 系数值,这个系数值就是 矩阵的行列式的倒数

    然后我们使用 矩阵的行列式的倒数 的结果,数乘伴随矩阵 得到的就是 逆矩阵

    矩阵的行列式 . 伴随矩阵 = 逆矩阵: A − 1 = 1 ∣ A ∣ ⋅ A ∗ A^{-1}=\frac{1}{|A|} \cdot A^* A1=A1A

    如果已知 逆矩阵矩阵行列式,那么 伴随矩阵 A ∗ = ∣ A ∣ ⋅ A − 1 A^* = |A| \cdot A^{-1} A=AA1


    总结 & 练习

    前面说明,逆矩阵 A − 1 A^{-1} A1作用就是将某个向量 A → \overrightarrow A A 应用了矩阵 A A A变换成的结果 B → \overrightarrow B B 的结果再反向变换回矩阵变换前的 A → \overrightarrow A A
    A ⋅ A → = B → A − 1 ⋅ B → = A → A \cdot \overrightarrow A=\overrightarrow B\\ \\ A^{-1} \cdot \overrightarrow B= \overrightarrow A AA =B A1B =A

    这种应用是非常广泛的,矩阵Unity中大家都应该熟悉的:GameObject 下的 Transform 组件类有 LocationPositionPosition

    • LocationPosition 是对象的局部坐标
    • Position 是世界坐标

    假设有GameObject A,B,C,他们的父级关系是:A是B的父级,B是C的父级:

    A
    |
    +--->B
    	 |
    	 +--->C
    

    如果A,B有缩放、旋转、位移过,这时想在脚本里设置C的世界的标对齐到场景中某个对象D的世界位置对齐。

    为了方便,直接设置某个C的Position等于D的Position即可,伪代码如下:

    GameObject A, B, C, D;
    
    void Start() {
    	B.Transform.SetParent(A.Transform);
    	C.Transform.SetParent(B.Transform);
    
    	D.Transform.SetParent(.....);
    }
    
    void C_Locate_to_D() {
    	C.Transform.Position = D.Transform.Position;
    }
    

    主要看:C.Transform.Position = D.Transform.Position; 这句即可,它内部处理起始用了逆矩阵来更新LocationPosition,这样外部用起来就相当方便了。

    Transform 类的代码中,设置 Position 的伪代码大概如下:

    class Transform {
    	Matrix4x4 local2worldMatrix; 			// local 局部坐标 变换到 world 世界坐标的矩阵
    	Matrix4x4 world2localnMatrix;			// world 世界坐标 变换到 local 矩阵坐标的矩阵,它就是location2worldMatrix矩阵的逆矩阵
    	
    	public Vector3 Position {
    		get => position;
    		set {
    			position = value;
    			localPosition= world2localnMatrix.MultiplePoint(position); // 根据 世界坐标 反向变换回 局部坐标
    		}
    	}
    	
    	public Vector3 LocationPosition {
    		get => localPosition;
    		set { localPosition= value; }
    	}
    
    	private Vector3 position;				// 世界坐标
    	private Vector3 localPosition;			// 矩阵坐标
    }
    

    这就有点像是上面说过的:

    假设有一个 局部坐标世界坐标 的变换矩阵 M a t l w 2 Mat_{lw2} Matlw2(lw2==Local To World 的简写):
    M a t l 2 w = [ a b c d ] Mat_{l2w}=\begin{bmatrix}a & b\\c & d\end{bmatrix} Matl2w=[acbd]
    然后是 M a t l 2 w Mat_{l2w} Matl2w 的逆矩阵 M a t w 2 l Mat_{w2l} Matw2l(w2l==World To Local),它的作用是 世界坐标局部坐标 的变换:
    M a t w 2 l = 1 a d − b c ⋅ [ d − b − c a ] Mat_{w2l}=\frac{1}{ad-bc}\cdot \begin{bmatrix}d & -b\\-c & a\end{bmatrix} Matw2l=adbc1[dcba]

    然后是 局部坐标 P o s l Pos_{l} Posl(l==Local):
    P o s l = [ x l y l ] Pos_{l}=\begin{bmatrix}x_{l}\\y_{l}\end{bmatrix} Posl=[xlyl]

    然后是 世界坐标 P o s w Pos_{w} Posw(w==World):
    P o s w = [ x w y w ] Pos_{w}=\begin{bmatrix}x_{w}\\y_{w}\end{bmatrix} Posw=[xwyw]

    那么 将 局部坐标 变换到 世界坐标

    M a t l 2 w ⋅ P o s l = P o s w Mat_{l2w} \cdot Pos_{l} = Pos_{w} Matl2wPosl=Posw

    [ a b c d ] ⋅ [ x l y l ] = [ x w y w ] \begin{bmatrix} a & b\\ c & d \end{bmatrix} \cdot \begin{bmatrix} x_{l}\\y_{l} \end{bmatrix} =\begin{bmatrix} x_{w}\\y_{w} \end{bmatrix} [acbd][xlyl]=[xwyw]

    那么 将 世界坐标 变换到 局部坐标

    M a t w 2 l ⋅ P o s w = P o s l Mat_{w2l} \cdot Pos_{w} = Pos_{l} Matw2lPosw=Posl

    1 a d − b c ⋅ [ d − b − c a ] ⋅ [ x w y w ] = [ x l y l ] \frac{1}{ad-bc}\cdot \begin{bmatrix}d & -b\\-c & a\end{bmatrix} \cdot \begin{bmatrix} x_{w}\\y_{w} \end{bmatrix} =\begin{bmatrix} x_{l}\\y_{l} \end{bmatrix} adbc1[dcba][xwyw]=[xlyl]

    最后的通过设置世界坐标的 P o s w Pos_{w} Posw 时,我们是已知 P o s w Pos_{w} Posw 世界坐标点的,和 M a t w 2 l Mat_{w2l} Matw2l 都是已知的,求 P o s l Pos_{l} Posl 是肯定可以的。

    M a t w 2 l ⋅ P o s w = P o s l Mat_{w2l} \cdot Pos_{w} = Pos_{l} Matw2lPosw=Posl

    但最终的终极理解这个变换,你可以这么理解(可参考 可汗学院 里的视频:Matrix world problem: vector combination):
    M a t w 2 l Mat_{w2l} Matw2l的第一列向量就是 w 2 l w2l w2l 坐标系下的 X 轴: [ x 1 y 1 ] \begin{bmatrix}x_1 \\ y_1\end{bmatrix} [x1y1],第二列向量就是 w 2 l w2l w2l 坐标系下的 Y 轴: [ x 2 y 2 ] \begin{bmatrix}x_2 \\ y_2\end{bmatrix} [x2y2],这两个轴分别缩放 [ x w y w ] \begin{bmatrix}x_w\\ y_w\end{bmatrix} [xwyw] 后,再相加(两个轴,或是两个向量相加),就等于 [ x l y l ] \begin{bmatrix}x_l \\ y_l\end{bmatrix} [xlyl]
    [ x 1 x 2 y 1 y 2 ] ⋅ [ x w y w ] = [ x l y l ] \begin{bmatrix}x_1 & x_2\\ y_1 & y_2\end{bmatrix} \cdot \begin{bmatrix}x_w\\y_w\end{bmatrix}=\begin{bmatrix}x_l \\ y_l\end{bmatrix} [x1y1x2y2][xwyw]=[xlyl]

    调整为:
    [ x 1 y 1 ] ⋅ x w + [ x 2 y 2 ] ⋅ y w = [ x l y l ] \begin{bmatrix}x_1 \\ y_1 \end{bmatrix} \cdot x_w + \begin{bmatrix}x_2 \\ y_2 \end{bmatrix} \cdot y_w = \begin{bmatrix}x_l \\ y_l\end{bmatrix} [x1y1]xw+[x2y2]yw=[xlyl]

    调整为文字+公式:
    W 2 L 的 轴 x ⋅ x w + W 2 L 的 轴 y ⋅ y w = 局 部 坐 标 ( W 2 L 的 轴 x 向 量 , 放 大 , 世 界 坐 标 的 x w 倍 ) + ( W 2 L 的 轴 y 向 量 , 放 大 , 世 界 坐 标 的 y w 倍 ) = 局 部 坐 标 W2L的轴_x \cdot x_w + W2L的轴_y \cdot y_w = 局部坐标\\ (W2L的轴_x向量,放大,世界坐标的x_w倍) + (W2L的轴_y向量,放大,世界坐标的y_w倍)= 局部坐标 W2Lxxw+W2Lyyw=(W2Lx,,xw)+(W2Ly,,yw)=
    (但注意这里的W2L的X,Y轴,可能都是缩放、旋转过的)

    然后我在 可汗学院 的小考的里题目做测试,带上鼠标绘制(我的画板不见了)的过程与提交结果:
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述


    References

    展开全文
  • Matlab矩阵代数

    2013-02-12 23:49:36
    matlab中关于矩阵计算的部分内容,原创
  • 现代科学运算-matlab语言与应用 ... 《高等应用数学问题的MATLAB求解(第四版)》 代码可在matlab r2016b 运行。...04 线性代数问题的计算机求解 04.01 特殊矩阵输入 零矩阵、幺矩阵及单位矩阵 A = zeros(n), ...

    现代科学运算-matlab语言与应用

    东北大学 http://www.icourses.cn/home/ (薛定宇)
    《高等应用数学问题的MATLAB求解(第四版)》
    代码可在matlab r2016b 运行。

    04 线性代数问题的计算机求解

    04.01 特殊矩阵输入

    零矩阵、幺矩阵及单位矩阵
    A = zeros(n),
    B = ones(n),
    C = eye(n)
    A = zeros(m, n)
    B = ones(m, n)
    C = eye(m, n)
    A = zeros(size(B))
    A = zeros(n, m, …, k)

    例4-1 特殊矩阵的建立

    % 生成一个3x8的零矩阵A,生成一个和A维数相同的单位矩阵B
    A = zeros(3, 8),
    B = eye(size(A))
    % 注意: zeros() 和 ones() 也可用于多为数组的生成

    随机元素矩阵
    均匀分布随机数矩阵的输入
    [0, 1]区间,A = rand(n), A = rand(n, m)
    [a, b]区间, B = a + (b-a)*rand(n, m)
    征态分布随机数矩阵的输入
    标准征态分布N(0, 1): A = randn(n), A = randn(n, m)
    N(μ,σ2):B=μ+σrandn(n,m) N ( μ , σ 2 ) : B = μ + σ ∗ r a n d n ( n , m )

    对角元素矩阵
    对角矩阵的数学描述
    diag(a1,a2,,an)=a1a2an d i a g ( a 1 , a 2 , ⋯ , a n ) = [ a 1 a 2 ⋱ a n ]
    其中,所有的非对角元素都为0

    diag()函数的使用
    已知向量生成对角元素: A = diag(V)
    已知矩阵提取对角元素列向量: V = diag(A)
    生成主对角线上第k条对角线为v的矩阵: A = diag(v, k)
    注意: k可为负整数

    例4-2 diag()函数
    diag()函数的不同调用格式

    % 生成对角矩阵
    C = [1 2 3];
    V = diag(C)
    % 对角元素提取
    V1 = diag(V)
    % 生成主对角线上第2条对角线为C的矩阵
    C = [1 2 3];
    V2 = diag(C, 2), 
    V3 = diag(C, -1)

    Hankel矩阵
    Hankel矩阵的一般形式
    H=c1c2cnc2c3cn+1cmcm+1cn+m1 H = [ c 1 c 2 ⋯ c m c 2 c 3 ⋯ c m + 1 ⋮ ⋮ ⋱ ⋮ c n c n + 1 ⋯ c n + m − 1 ]
    反对角线上元素相同
    函数调用:
    H = hankel(C)
    H = hankel(C, R)
    C(end) = R(1)

    Vandermonde矩阵
    Vandermonde矩阵的数学描述
    V=cn11cn12cn1ncn22cn22cn2nc1c2cn111 V = [ c 1 n − 1 c 2 n − 2 ⋯ c 1 1 c 2 n − 1 c 2 n − 2 ⋯ c 2 1 ⋮ ⋮ ⋱ ⋮ ⋮ c n n − 1 c n n − 2 ⋯ c n 1 ]
    其中, vi,j=cnji,i,j=1,2,,n v i , j = c i n − j , i , j = 1 , 2 , ⋯ , n
    生成Vandermonde矩阵 V = vander(c)

    相伴矩阵
    一个首一化的多项式
    P(s)=sn+a1sn1+a2sn2++an1s+an P ( s ) = s n + a 1 s n − 1 + a 2 s n − 2 + ⋯ + a n − 1 s + a n
    其相伴矩阵
    Ac=a1100a2010an1001an000 A c = [ − a 1 − a 2 ⋯ − a n − 1 − a n 1 0 ⋯ 0 0 0 1 ⋯ 0 0 ⋮ ⋮ ⋱ ⋮ ⋮ 0 0 ⋯ 1 0 ]
    matlab函数: B = compan(p)

    例4-5 由多项式构造相伴矩阵
    考虑一个多项式 P(s)=2s4+4s2+5s+6 P ( s ) = 2 s 4 + 4 s 2 + 5 s + 6
    求其相伴矩阵
    非首一多项式,可以自动转换

    P = [2 0 4 5 6];
    A = compan(P)

    符号矩阵输入
    数值矩阵A转符号矩阵B: B = sym(A)
    早期版本支持重载函数的方式,并置于目录@sym下,可编写compan, hankel, vander
    最新版本这三个函数直接支持符号矩阵

    任意矩阵输入
    任意向量输入方法
    行向量: A = sym(‘a%d’, [1, n])
    列向量: A = sym(‘a%d’, [n, 1])
    任意矩阵的输入方法
    方阵输入: A = sym(‘a%d%d’, n)
    任意矩阵输入: A = sym(‘a%d%d’, [n, m])

    例4-7 任意矩阵的生成
    输入如下任意矩阵
    A=a11a21a31a41a12a22a32a42a13a23a33a43a14a24a34a44 A = [ a 11 a 12 a 13 a 14 a 21 a 22 a 23 a 24 a 31 a 32 a 33 a 34 a 41 a 42 a 43 a 44 ]
    B=a11a21a31a41a12a22a32a42 B = [ a 11 a 12 a 21 a 22 a 31 a 32 a 41 a 42 ]
    C=f11f21f31f41f12f22f32f42f13f23f33f43f14f24f34f44 C = [ f 11 f 12 f 13 f 14 f 21 f 22 f 23 f 24 f 31 f 32 f 33 f 34 f 41 f 42 f 43 f 44 ]

    A = sym('a%d%d', 4),
    B = sym('a%d%d', [4,2]),
    C = sym('f%d%d', [4, 4])

    稀疏矩阵输入
    稀疏矩阵:矩阵大部分元素为零,仅少部分元素非零.
    稀疏矩阵输入: A = sparse(p, q, w)
    稀疏矩阵与常规矩阵转换:B = full(A), A = sparse(B)

    04.02 矩阵性质分析

    行列式
    矩阵 A={aij} A = { a i j } 的行列式定义为
    D=|A|=det(A)=(1