Ea 发表于 2003-2-11 21:44:00

[原创]逆矩阵。

;;获取3D矩阵的逆矩阵;
(defun ea:matrix_inverse (matrix /        m0   m1   m2   m3
                          m00       m01        m02    m03    m10    m11
                          m12       m13        m20    m21    m22    m23
                          _a       ea:determinant              a11    a12
                          a21       a22        a33    a34    a41    a42
                          a43       a13        a23    a31    a32
                       )
;;行列式展开,计算代数余子式
(defun ea:determinant        (a00 a01 a02 a10 a11 a12 a20 a21 a22 /)
    (- (+ (* a00 a11 a22)
          (* a01 a12 a20)
          (* a02 a21 a10)
       )
       (* a02 a11 a20)
       (* a01 a10 a22)
       (* a00 a21 a12)
    )
)
(setq        m0 (car matrix)
        m1 (cadr matrix)
        m2 (nth 2 matrix)
        m3 (last matrix)
)
(setq        m00 (car m0)
        m01 (cadr m0)
        m02 (nth 2 m0)
        m03 (last m0)
)
(setq        m10 (car m1)
        m11 (cadr m1)
        m12 (nth 2 m1)
        m13 (last m1)
)
(setq        m20 (car m2)
        m21 (cadr m2)
        m22 (nth 2 m2)
        m23 (last m2)
)
(setq        a11 (ea:determinant m11 m12 m13 m21 m22 m23 0.0 0.0 1.0)
        a12 (- (ea:determinant m10 m12 m13 m20 m22 m23 0.0 0.0 1.0))
        a13 (ea:determinant m10 m11 m13 m20 m21 m23 0.0 0.0 1.0)
        a21 (- (ea:determinant m01 m02 m03 m21 m22 m23 0.0 0.0 1.0))
        a22 (ea:determinant m00 m02 m03 m20 m22 m23 0.0 0.0 1.0)
        a23 (- (ea:determinant m00 m01 m03 m20 m21 m23 0.0 0.0 1.0))
        a31 (ea:determinant m01 m02 m03 m11 m12 m13 0.0 0.0 1.0)
        a32 (- (ea:determinant m00 m02 m03 m10 m12 m13 0.0 0.0 1.0))
        a33 (ea:determinant m00 m01 m03 m10 m11 m13 0.0 0.0 1.0)
        a41 (- (ea:determinant m01 m02 m03 m11 m12 m13 m21 m22 m23))
        a42 (ea:determinant m00 m02 m03 m10 m12 m13 m20 m22 m23)
        a43 (- (ea:determinant m00 m01 m03 m10 m11 m13 m20 m21 m23))

)
(list        (list a11 a21 a31 a41)
        (list a12 a22 a32 a42)
        (list a13 a23 a33 a43)
        '(0.0 0.0 0.0 1.0)
)
)

zhenz02 发表于 2019-7-28 22:36:37

收藏慢慢研究,谢谢楼主

hi-kit 发表于 2020-3-25 14:23:29

学习学习!过来顶一下!

水仙的错 发表于 2019-9-15 17:46:56

发个动态图看看啊

龙龙仔 发表于 2003-2-12 08:02:00

EA大俠也來了,真高興!!!可否說說"逆矩阵"在LISP的應用

EA 大俠也來了,真高興!!!可否說說"逆矩阵"在LISP的應用

myjping 发表于 2011-12-26 16:09:18

好像有问题,逆逆矩阵不相等

ygp820601 发表于 2011-12-26 16:40:41

测试矩阵是什么?

myjping 发表于 2011-12-26 17:08:02

随便一个都可以
我搞明白了,你没有除模

myjping 发表于 2011-12-26 17:08:42

;;获取3D矩阵的逆矩阵-YAN 修定
(defun matrix_inverse (matrix /      m0   m1   m2   m3
                        m00         m01      m02    m03    m10    m11
                        m12         m13      m20    m21    m22    m23
                        _a         determinant            a11    a12
                        a21         a22      a33    a34    a41    a42
                        a43         a13      a23    a31    a32
                         )
;;行列式展开,计算代数余子式
(defun determinant      (a00 a01 a02 a10 a11 a12 a20 a21 a22 /)
    (- (+ (* a00 a11 a22)
          (* a01 a12 a20)
          (* a02 a21 a10)
       )
       (* a02 a11 a20)
       (* a01 a10 a22)
       (* a00 a21 a12)
    )
)

(setq m0 (car matrix)
      m1 (cadr matrix)
      m2 (caddr matrix)
      m3 (last matrix)
)
(setq m00 (car m0)
      m01 (cadr m0)
      m02 (nth 2 m0)
      m03 (last m0)
)
(setq m10 (car m1)
      m11 (cadr m1)
      m12 (nth 2 m1)
      m13 (last m1)
)
(setq m20 (car m2)
      m21 (cadr m2)
      m22 (nth 2 m2)
      m23 (last m2)
)
(setq molA (determinant m00 m01 m02 m10 m11 m12 m20 m21 m22 ))
(princ molA)
(setq a11 (/(determinant m11 m12 m13 m21 m22 m23 0.0 0.0 1.0) molA)
      a12 (/(- (determinant m10 m12 m13 m20 m22 m23 0.0 0.0 1.0)) molA)
      a13 (/(determinant m10 m11 m13 m20 m21 m23 0.0 0.0 1.0) molA)
      a21 (/(- (determinant m01 m02 m03 m21 m22 m23 0.0 0.0 1.0)) molA)
      a22 (/(determinant m00 m02 m03 m20 m22 m23 0.0 0.0 1.0) molA)
      a23 (/(- (determinant m00 m01 m03 m20 m21 m23 0.0 0.0 1.0)) molA)
      a31 (/(determinant m01 m02 m03 m11 m12 m13 0.0 0.0 1.0) molA)
      a32 (/(- (determinant m00 m02 m03 m10 m12 m13 0.0 0.0 1.0)) molA)
      a33 (/(determinant m00 m01 m03 m10 m11 m13 0.0 0.0 1.0) molA)
      a41 (/(- (determinant m01 m02 m03 m11 m12 m13 m21 m22 m23)) molA)
      a42 (/(determinant m00 m02 m03 m10 m12 m13 m20 m22 m23) molA)
      a43 (/(- (determinant m00 m01 m03 m10 m11 m13 m20 m21 m23)) molA)

)
(list (list a11 a21 a31 a41)
      (list a12 a22 a32 a42)
      (list a13 a23 a33 a43)
      '(0.0 0.0 0.0 1.0)
)
)

ygp820601 发表于 2011-12-26 23:54:18

呵呵,公式错了,代数余子式应该除以原矩阵的行列式。
如下:
;;获取3D矩阵的逆矩阵;
(defun ea:matrix_inverse (matrix /      m0   m1   m2   m3
                        m00         m01      m02    m03    m10    m11
                        m12         m13      m20    m21    m22    m23
                        _a                      a11    a12
                        a21         a22      a33    a34    a41    a42
                        a43         a13      a23    a31    a32
                         )
;;行列式展开,计算代数余子式
(defun ea:determinant      (a00 a01 a02 a10 a11 a12 a20 a21 a22 /)
    (- (+ (* a00 a11 a22)
          (* a01 a12 a20)
          (* a02 a21 a10)
       )
       (* a02 a11 a20)
       (* a01 a10 a22)
       (* a00 a21 a12)
    )
)                                       

(setq      m0 (car matrix)
      m1 (cadr matrix)
      m2 (nth 2 matrix)
      m3 (last matrix)
)
(setq      m00 (car m0)
      m01 (cadr m0)
      m02 (nth 2 m0)
      m03 (last m0)
)
(setq      m10 (car m1)
      m11 (cadr m1)
      m12 (nth 2 m1)
      m13 (last m1)
)
(setq      m20 (car m2)
      m21 (cadr m2)
      m22 (nth 2 m2)
      m23 (last m2)
)

(setq      
                a   (ea:determinant m00 m01 m02 m10 m11 m12 m20 m21 m22)
                a11 (/ (ea:determinant m11 m12 m13 m21 m22 m23 0.0 0.0 1.0) a)
      a12 (/ (- (ea:determinant m10 m12 m13 m20 m22 m23 0.0 0.0 1.0)) a)
      a13 (/ (ea:determinant m10 m11 m13 m20 m21 m23 0.0 0.0 1.0) a)
      a21 (/ (- (ea:determinant m01 m02 m03 m21 m22 m23 0.0 0.0 1.0)) a)
      a22 (/ (ea:determinant m00 m02 m03 m20 m22 m23 0.0 0.0 1.0) a)
      a23 (/ (- (ea:determinant m00 m01 m03 m20 m21 m23 0.0 0.0 1.0)) a)
      a31 (/ (ea:determinant m01 m02 m03 m11 m12 m13 0.0 0.0 1.0) a)
      a32 (/ (- (ea:determinant m00 m02 m03 m10 m12 m13 0.0 0.0 1.0)) a)
      a33 (/ (ea:determinant m00 m01 m03 m10 m11 m13 0.0 0.0 1.0) a)
      a41 (/ (- (ea:determinant m01 m02 m03 m11 m12 m13 m21 m22 m23)) a)
      a42 (/ (ea:determinant m00 m02 m03 m10 m12 m13 m20 m22 m23) a)
      a43 (/ (- (ea:determinant m00 m01 m03 m10 m11 m13 m20 m21 m23)) a)

)
(list      (list a11 a21 a31 a41)
      (list a12 a22 a32 a42)
      (list a13 a23 a33 a43)
      '(0.0 0.0 0.0 1.0)
)
)

狂刀lxx 发表于 2011-12-27 01:44:11

本帖最后由 狂刀lxx 于 2011-12-27 02:05 编辑

;| 检测是否是逆矩阵
;; 根据公式 AB=BA=E 则,A B互为逆矩阵.

原帖貌似有问题,楼上修改过的测试结果是对的

myjping 发表于 2011-12-27 09:32:52

呵呵,不容易啊,这么多年的贴子又翻出来了,楼主的这个变换矩阵的思路值的我学习。
同时这个东东用途也很大啊,坐标的变换就得用它

skynoon 发表于 2012-1-5 12:50:27

很不错   
页: [1] 2
查看完整版本: [原创]逆矩阵。