最近在学习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. Xstream解析报文
  2. windows环境下安装elasticsearch
  3. 详解log4j2(下) - Log4j2在WEB项目中配置
  4. SAP Spartacus category在breadcrumb里显示不正确的一个问题
  5. java8自定义收集器_使用自定义收集器进行Java 8分组?
  6. 计算机视觉论文-2021-06-17
  7. Redis的安装及原理介绍
  8. oracle 自定义表类型赋值,Oracle自定义类型 Record + PL/SQL表
  9. 在shell中使用echo命令输出带颜色的文本-转
  10. Wondershare DVD Creator mac版如何刻录光盘文件
  11. 入门命令5-流程跳转:goto
  12. ajax 怎么添加,添加功能(Ajax版)
  13. 美工建模-PR视频剪辑自学教程
  14. 浅述BLP和Biba模型
  15. 如何清除 浏览器-hao123的绑定
  16. 如何制作一款Chrome浏览器扩展程序
  17. bugku:简单的套娃
  18. [转]复合信号、S-Video信号、分量信号
  19. PHP+AJAX教程(详细)
  20. SLB 负载均衡实践

热门文章

  1. 华为v30鸿蒙系统,荣耀V30怎么升级鸿蒙系统 荣耀V30升级鸿蒙系统步骤教程
  2. 用量子理论凭空生成能量:物理学家学会使用零点能
  3. 普通人做抖音生活号怎么赚钱?掌握这几点日入500+。丨国仁网络资讯
  4. 【Devc++】8款经典小游戏
  5. 面向对象编程(基础)7:再谈方法(重载)
  6. python处理excel数据(含日期数据)
  7. 华为 MateStation X 2022评测
  8. abs、fabc、acos、double输入输出
  9. 策略模式 - 这波不亏
  10. ES复合查询的实现 SpringBoot实现