[原创]逆矩阵。
;;获取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)
)
) 收藏慢慢研究,谢谢楼主 学习学习!过来顶一下! 发个动态图看看啊
EA大俠也來了,真高興!!!可否說說"逆矩阵"在LISP的應用
EA 大俠也來了,真高興!!!可否說說"逆矩阵"在LISP的應用 好像有问题,逆逆矩阵不相等 测试矩阵是什么? 随便一个都可以我搞明白了,你没有除模 ;;获取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)
)
) 呵呵,公式错了,代数余子式应该除以原矩阵的行列式。
如下:
;;获取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 02:05 编辑
;| 检测是否是逆矩阵
;; 根据公式 AB=BA=E 则,A B互为逆矩阵.
原帖貌似有问题,楼上修改过的测试结果是对的 呵呵,不容易啊,这么多年的贴子又翻出来了,楼主的这个变换矩阵的思路值的我学习。
同时这个东东用途也很大啊,坐标的变换就得用它 很不错
页:
[1]
2