首页 > 常用资料 > 二次曲面拟合的副产品:用LISP写的矩阵乘法程序
2009
09-14

二次曲面拟合的副产品:用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写的矩阵乘法程序:[mDown=attachments/month_0909/20090914221236_mmult.rar]MMULT.RAR[/mDown]

最后编辑:
作者:z.kklt
这个作者貌似有点懒,什么都没有留下。

留下一个回复