找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2156|回复: 6

[研讨] 有没有更快的求逆矩阵的方法

[复制链接]

已领礼包: 3913个

财富等级: 富可敌国

发表于 2013-6-10 18:09:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 dnbcgrass 于 2013-6-10 18:10 编辑

下面是生成n阶非奇异矩阵(n×n阶方阵)函数

  1. ;========================   Cszdfz   ==================================================================
  2. ;; 用法:
  3. ;;        (Cszdfz 矩阵的阶数XN)
  4. ;; 返回值:
  5. ;;    (n+2)/(2n+2)  -1/2   0      0     ...     0     1/(2n+2)
  6. ;;    -1/2          1      -1/2   0     ...     0     0
  7. ;;    0             -1/2   1      -1/2  ...     0     0
  8. ;;    ..............................................
  9. ;;    0  ...                              -1/2  1   -1/2
  10. ;;    1/(2n+2) 0 ..............................-1/2  (n+2)/(2n+2)
  11. (defun Cszdfz(XN  / B i j zb dx)
  12.      (setq B nil i 1)
  13.      (repeat xn
  14.          (setq j 1 zb nil)
  15.          (repeat xn
  16.              (if (= i j)
  17.                  (progn
  18.                      (setq dx 1.0)
  19.                      (if (or (= i 1) (= i xn))
  20.                          (setq dx (/ (+ xn 2.0) (+ (* 2.0 xn) 2.0)))
  21.                      )
  22.                  )
  23.                  (if (or (= (1- i) j) (= (1+ i) j))
  24.                      (setq dx -0.5)
  25.                      (progn
  26.                          (setq dx 0.0)
  27.                          (if (or (and (= i 1) (= j xn))
  28.                                  (and (= i xn) (= j 1))
  29.                              )
  30.                              (setq dx (/ 1.0 (+ (* 2.0 xn) 2.0)))
  31.                          )
  32.                      )
  33.                  )
  34.              )
  35.              (setq zb (cons dx zb)
  36.                    j  (1+ j)
  37.              )
  38.         )
  39.         (setq B (cons (reverse zb) B)
  40.               i (1+ i)
  41.         )
  42.      )
  43.      (setq B (reverse B))
  44. )
下面是求n阶非奇异矩阵的逆矩阵的函数,好像是由Highflybird提供,出自何处记不得清了,
用上面生成的矩阵,采用该函数(Inverse)求得的逆矩阵为:
n    n-1  n-2 ...    1    2
n-1  n    n-1 ...    3    2
n-2  n-1  n   ...    4    3
..........................
2    3   4    ...    n    n-1
1    2   3    ...    n-1  n
但是,当n大于500以上时,速度很慢,大家有没有更快的方法?

  1. ;=============   Inverse  ========================================================================
  2. ;; Matrix Inverse  -  gile & Lee Mac
  3. ;; Uses Gauss-Jordan Elimination to return the inverse of a non-singular nxn matrix.
  4. ;; Args: m - nxn matrix
  5. (defun Inverse ( m / c f p r d)
  6.     (defun ff ( p m )
  7.         (mapcar '(lambda ( x ) (mapcar '(lambda ( a b ) (- a (* (car x) b))) (cdr x) p)) m)
  8.     )
  9.   
  10.     (setq m (mapcar 'append m (imat (length m))));原矩阵 单位矩阵
  11.     (while m
  12.         (setq c (mapcar '(lambda ( x ) (abs (car x))) m))
  13.         (repeat (vl-position (apply 'max c) c)
  14.             (setq m (append (cdr m) (list (car m))))
  15.                  
  16.         )
  17.         (if (equal 0.0 (caar m) 1e-14)
  18.             (setq m nil
  19.                   r nil
  20.             )
  21.             (setq p (mapcar '(lambda ( x ) (/ (float x) (caar m))) (cdar m))
  22.                   m (ff p (cdr m))
  23.                   r (cons p (ff p r))
  24.             )
  25.         )
  26.     )
  27.     (reverse r)
  28. )

  29. ;;=============   imat  ===========================================================================
  30. ;; Identity Matrix  -  Lee Mac
  31. ;; Args: n - matrix dimension
  32. (defun imat ( n / i j l m )
  33.     (repeat (setq i n)
  34.         (repeat (setq j n)
  35.             (setq l (cons (if (= i j) 1.0 0.0) l)
  36.                   j (1- j)
  37.             )
  38.         )
  39.         (setq m (cons l m)
  40.               l nil
  41.               i (1- i)
  42.         )
  43.     )
  44.     m
  45. )

评分

参与人数 1D豆 +10 贡献 +1 收起 理由
XDSoft + 10 + 1 好主题奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-6-10 19:54:51 | 显示全部楼层
在网上搜一搜,选个好的算法,只不过把其他语言转换成lisp好了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-6-10 20:03:16 | 显示全部楼层
LEE-MAC的Identity Matrix ,楼主测试了吗,效率如何?

点评

提供篇资料, 只要是数学方法,应该不会太慢的,看看组合下LISP的函数,尽量使用基本函数。  详情 回复 发表于 2013-6-10 20:19
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-6-10 20:19:23 | 显示全部楼层
XDSoft 发表于 2013-6-10 20:03
LEE-MAC的Identity Matrix ,楼主测试了吗,效率如何?

提供篇资料, 只要是数学方法,应该不会太慢的,看看组合下LISP的函数,尽量使用基本函数。

下载地址:晓东文库


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-6-10 20:24:15 来自手机 | 显示全部楼层
在AutoCAD中讨论广义逆矩阵没多大意义,作为知识了解还是必要的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-10 20:30:16 | 显示全部楼层
楼主,这种N级的测试效率的,里面一定不能有APPEND,你的代码里面有APPEND,你看看用CONS和LISP组合能替代不,效率慢应该是APPEND的原因。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-10 22:44:02 来自手机 | 显示全部楼层
在AutoCAD下只要讨论4x4就够了来自: Android客户端
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 18:52 , Processed in 0.186573 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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