二次曲面拟合的副产品:用LISP写的矩阵乘法程序

    最近一段时间在看水准面精化,先研究二次曲面拟合,最后计算参数要用到矩阵的系列运算,包括矩阵的乘法、矩阵求逆、矩阵转置。毕业了N年,这些东西早不晓得丢哪里去了,现在只好重新研究,矩阵转置最简单,先放一放;矩阵乘法还略有印象,先整矩阵乘法。

    EXCEL中有现成的矩阵乘法的公式,具体用法为:MMULT(ARRAY1,ARRAY2),选定结果区域,再按Ctrl+Shift+Enter。

    用EXCEL试验下算法可以,要批量转换,还得自己写程序。莫法,只会点LISP,但是LISP里面没有现成的矩阵乘法函数,只有自己写了。

    先复习一下矩阵乘法的算法:
    M行N列矩阵乘N行K列矩阵,得到M行K列矩阵,具体算法为:第一个矩阵的第一行分别乘以第二个矩阵的第一列,再加起来,记在第一行第一列的位子,再把第一个矩阵的第一行分别乘以第二个矩阵的第二列,再加起来,记在第一行的第二列位子上。。。一直乘到K列,得到乘积矩阵的第一行;再换第一个矩阵的第二行、第三行。。。直到第M行,最终得到M行K列矩阵。
    简单说来,就是乘积矩阵中,第I行J列的元素等于第一个矩阵的第I行乘于第二个矩阵的第J列,再求和。

;数组乘法,arraymn与arraynk相乘,得到arraymk
;m行n列数组与n行k列数组相乘,得到m行k列数组
;arraymn(3*2)
;((m1n1 m1n2) (m2n1 m2n2) (m3n1 m3n2))
;arraynk(2*2)
;((n1k1 n1k2) (n2k1 n2k2))
;数组的第m个元素序列为数组的第m行,第m个元素序列的第n个元素为数组的第m行第n列的数据


(defun mmult (arraymn arraynk / am an1 an2 ak ami ani aki)
...
)

用法:
定义ARRAYMN:
(setq arraymn (list (list 1.1 1.2) (list 2.1 2.2) (list 3.1 3.2)))

定义ARRAYNK:
(setq arraynk (list (list 1.1 1.2 1.3) (list 2.1 2.2 2.3) ))

矩阵相乘:
(mmult arraymn arraynk)

乘积矩阵ARRAYMK:
((3.73 3.96 4.19) (6.93 7.36 7.79) (10.13 10.76 11.39))

LISP写的矩阵乘法程序:





[本日志由 z.kklt 于 2009-09-14 10:17 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: 二次曲面 拟合 LISP 矩阵 乘法
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.