最近在学习Autolisp编程,程序中用到了矩阵运算,如果像C语言(或C++)语言编程那样一个个处理矩阵中的元素,那程序要写很长,而且很容易出错。在论坛中,网上搜索发现,mapcar、lambda和apply三个函数用好了,对矩阵运算非常方便。于是查手册,看看三个函数的用法:

Apply: (apply 'function list)
 将参数表传给指定的函数
参数:
         ' function ——函数,可以是表示defun或lambda表达式的符号。
          list           ——表。如果函数不接收参数,则该参数为nil。

返回值:
    函数调用的结果。---------注意该函数返回值为一个值,数值、字符串等。
例如:   (apply '+ '(1 2 3))     结果为 6
  这个函数看似不难用,理解也比较容易。
Mapcar:(mapcar function list1 ……listn)

将作为本函数参数的一个或多个表的各个元素提供给指定函数进行求值,并将由求值结果构成的表返回。

参数:

function ——函数。

list1……listn——一个或多个表。

返回值:

表。--------注意返回值是一个表。

例如:(mapcar '1+ '(10 11 12))    结果为 (11 12 13)

这个函数看起来也不难理解,注意返回结果为表就行了。

再看第三个——

Lambda:(lambda arguments expr……)

在经常使用某一个表达式,而又觉得把它定义成一个新函数开销太大时,可以使用lambda函数。lambda将定义的函数放在要使用它的位置,还可以使程序员的意图表达得更清楚。lambda函数返回它最后一个expr的值。它常与apply和(或)mapcar函数连用,以便对表中的元素执行某个运算。

参数:

argument——传给表达式的参数

expr        ——Autolisp表达式。

返回值

最后一个expr的值。

这个函数光看这个解释有点不知所云了,还是看个例子吧。

例如:(apply '(lambda ( x y z) (* x (- y z))) '(5  20 14))    结果 30

能不能看出来函数是如何计算的? 5*(20-14)=30。其中 (lambda ( x y z) (* x (- y z))) 是定义的无名函数, 也就是apply函数的第一个参数,'(5 20 14 )apply的第二个参数表。这么一拆分也就理解了。

好了,熟悉了三个函数的使用方法,回到正题。如何在矩阵运算中应用这三个函数呢,能怎么帮我们简化代码呢?!

在Lee Mac Programming: Custom Programs for AutoCAD找到了这样一段代码:

;; Matrix x Vector - Vladimir Nesterovsky
;; Args: m - nxn matrix, v - vector in R^n(defun mxv ( m v )(mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
)

功能是求n阶方阵和n维列向量的乘法,代码太简洁了。

不知道你是不是看懂了函数是如何运算的,把它分解一下(mapcar  '(……) m),其中'(……)是无名函数,他要对表m的每一个元素进行计算,m的元素是什么?n维向量!

再看看这个无名函数(lambda (r) (……))其中参数r是什么?对!m的每一个元素。

(……)这个运算是什么呢?(apply ‘+ (mapcar ’* r v))  r中每个元素和v中每个元素相乘的形成的表再求和。

最后的结果是什么?mapcar在最外层,肯定是个表,对了,n维向量!不知道你看明白了没有。

好了,我的程序中要求矩阵的特征值和特征向量。计算过程中用到了协方差的计算,涉及到了m×n维矩阵与m维向量的乘法,m×n维矩阵与n×m维矩阵的运算,下面把我写的代码发一下,大家慢慢理解吧:

(setq lst (mapcar '(lambda (c) (mapcar '(lambda (r) (apply '+ (mapcar '* r c))) matrix)) matrix))

其中:matrix是m×n阶矩阵,结果是n×n阶方阵,赋值给lst。

(setq covMx (mapcar '(lambda (r) (mapcar '(lambda (x) (/ x num)) r)) lst))

将上一步计算所得的方阵每个元素都除以num(一个数)。

希望我的代码能帮到你!

apply、mapcar、lambda在矩阵运算中的应用小结(AutoLISP)相关推荐

  1. pandas使用apply函数和lambda函数、把所有行指定的数据列进行相加(use apply and lambda to add value in dataframe rows)

    pandas使用apply函数和lambda函数.把所有行指定的数据列进行相加(use apply and lambda to add value in dataframe rows) 目录

  2. java lambda函数_最常用的 Java 8 中的 Lambda 函数(项目中实用笔记)

    最常用的 Java 8 中的 Lambda 函数(项目中实用笔记) 简介 Java 8 中的新特性,虽然现在都出到了Java14版本,不过在日常的开发过程中,8的版本是足够使用了,再说现在的8以上的版 ...

  3. Python坑:bool是int的子类、列表循环中的变量泄露、lambda在闭包中会保存局部变量、重用全局变量

    bool是int的子类 a = True print isinstance(a, int) print True == 1 print False == 0 运行结果: True True True ...

  4. 扩展 delphi 泛型 以实现类似lambda功能 , C#中的any count first last 等扩展方法

    扩展 delphi 泛型 以实现类似lambda功能 , C#中的any count first last 等扩展方法 在C#中对泛型的扩展,输入参数是泛型本身的内容,返回值则是bool.基于这一点, ...

  5. lambda函数if_Python中lambda的使用,与它的三个好基友介绍

    匿名函数lambda 除了def语句,python还提供了一种生成函数对象的表达式形式.由于它与LISP语言中的一个工具类似,所以称为lambda. 就像def一样,这个表达式创建了一个之后能够调用的 ...

  6. lambda函数if_Python中lambda的使用,与它的三个好基友介绍!

    匿名函数lambda 除了def语句,python还提供了一种生成函数对象的表达式形式.由于它与LISP语言中的一个工具类似,所以称为lambda. 就像def一样,这个表达式创建了一个之后能够调用的 ...

  7. 如何在lambda表达式域中使用局部变量?

    如何在lambda表达式域中使用局部变量? Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代 ...

  8. 数据挖掘中分类算法小结

    数据挖掘中分类算法小结   数据仓库,数据库或者其它信息库中隐藏着许多可以为商业.科研等活动的决策提供所需要的知识.分类与预测是两种数据分析形式,它们可以用来抽取能够描述重要数据集合或预测未来数据趋势 ...

  9. vlc android 编译 mac,在Mac中编译vlc-android小结

    在Mac中编译vlc-android小结 在Mac中编译vlc-android小结 VLC  CodeSource https://code.videolan.org/explore This pag ...

最新文章

  1. java 读出数字声音_【求助】已经计算出的数字结果,想用声音播放出来。怎么弄!!!...
  2. android system window,Android控件的fitSystemWindows属性
  3. iOS ASIHTTPRequest用https协议加密请求
  4. vim中的 recording
  5. 并发编程之Synchronized
  6. 华为nova5i计算机有计算记录吗,华为nova 5i正式发布,看完价格后:还是算了吧!...
  7. Error occurred while trying to proxy request
  8. 聊聊 vue 生命周期
  9. CSS 元素的定位之相对定位 position: relative
  10. Word2vec之CBOW模型和Skip-gram模型形象解释
  11. BZOJ3437 小P的牧场
  12. Codeforces 396C
  13. Jenkins持续集成学习-搭建jenkins问题汇总
  14. java关闭窗口的6种方法
  15. 树莓派-12-投屏秒变家庭影院kodi跨平台媒体播放器
  16. Bootable USB Stick
  17. Excel如何批量生成条形码?
  18. 查看linux下eclipse进程,Linux环境安装Eclipse工具开发
  19. 设置windows补丁自动更新指向固定服务器
  20. Android 应用在后台弹出提示相关的笔记1

热门文章

  1. C++链列表的获取队首元素方法(retrieve)
  2. linux - 守护进程的方式
  3. 用C语言实现飞机大战游戏编写
  4. PDA和PAD的区别何在?
  5. 发布CSDN草稿箱里的文章
  6. 页面(HTML)优化的方法
  7. QQ第三方登录认证流程
  8. 黑鲨科学计算机,黑鲨科技称JOYUI系统将迎来重大升级,新系统将集成MIUI多项功能...
  9. Windows下小狼毫输入法(Rime)的安装与配置
  10. 合并、撤站、裁团,社区团购的“诸神黄昏”降临?