明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5556|回复: 16

[原创]逆矩阵。

  [复制链接]
发表于 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)
  )
)
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2019-7-28 22:36:37 | 显示全部楼层
收藏慢慢研究,谢谢楼主
发表于 2020-3-25 14:23:29 | 显示全部楼层
学习学习!过来顶一下!
发表于 2019-9-15 17:46:56 | 显示全部楼层
发个动态图看看啊
发表于 2003-2-12 08:02:00 | 显示全部楼层

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

EA 大俠也來了,真高興!!!可否說說"逆矩阵"在LISP的應用
发表于 2011-12-26 16:09:18 | 显示全部楼层
好像有问题,逆逆矩阵不相等
发表于 2011-12-26 16:40:41 | 显示全部楼层
测试矩阵是什么?
发表于 2011-12-26 17:08:02 | 显示全部楼层
随便一个都可以
我搞明白了,你没有除模
发表于 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)
  )
)
发表于 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)
  )
)
发表于 2011-12-27 01:44:11 | 显示全部楼层
本帖最后由 狂刀lxx 于 2011-12-27 02:05 编辑

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

原帖貌似有问题,楼上修改过的测试结果是对的
发表于 2011-12-27 09:32:52 | 显示全部楼层
呵呵,不容易啊,这么多年的贴子又翻出来了,楼主的这个变换矩阵的思路值的我学习。
同时这个东东用途也很大啊,坐标的变换就得用它
发表于 2012-1-5 12:50:27 | 显示全部楼层
很不错   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-17 12:56 , Processed in 0.200054 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表