Matrix 使用lisp的矩阵中的行和
我正在使用函数Matrix 使用lisp的矩阵中的行和,matrix,sum,lisp,row,apply,Matrix,Sum,Lisp,Row,Apply,我正在使用函数mapcar和apply做一些LISP练习。我在处理矩阵,我必须对它的行和列求和。我的专栏有: (apply #'mapcar #'+ matrix) 这很有效。因为我知道如何转置矩阵,所以我可以对行做完全相同的事情,对吗?对,那就是: (apply #'mapcar #'+ (apply #'mapcar #'list matrix)) 但是我对这件事不满意。我想直接对行求和,所以我做了一个apply的mapcar: (mapcar #'apply #'+ matrix)
mapcar
和apply
做一些LISP练习。我在处理矩阵,我必须对它的行和列求和。我的专栏有:
(apply #'mapcar #'+ matrix)
这很有效。因为我知道如何转置矩阵,所以我可以对行做完全相同的事情,对吗?对,那就是:
(apply #'mapcar #'+ (apply #'mapcar #'list matrix))
但是我对这件事不满意。我想直接对行求和,所以我做了一个apply
的mapcar
:
(mapcar #'apply #'+ matrix)
那不起作用,我不知道为什么。错误是
值#(函数+)不是列表类型。
[类型错误的条件]
对我来说,这将得到矩阵中的每个列表,并在每个列表中应用总和。我无法制作apply
的mapcar
?若否,原因为何?是否有其他方法仅使用mapcar
和apply
对矩阵行求和
PS:我正在使用lispstick进行编译,矩阵是一个列表列表。范例
((1 1 1) (2 2 2) (3 3 3))
对于3x3矩阵。您的错误
您得到的错误是,它希望在第一个参数之后列出参数,然后查找函数
解决方案
您需要的是to+
的部分应用程序,即
(defparameter matrix '((1 1 1) (2 2 2) (3 3 3)))
(mapcar (lambda (l) (apply #'+ l)) matrix)
==> (3 6 9)
您甚至可以为此定义一个函数:
(defun partial-application (f &rest some-args)
(lambda (&rest more-args)
(apply f (append some-args more-args))))
(funcall (partial-application #'+ 4) 5)
==> 9
(funcall (partial-application #'+ 1 2) 3 4 5)
==> 15
现在,您可以使用它而不是:
笔记:
(lambda(l)(apply#'+l))
和(partial application#'apply#'+)
仅计算列表的总和,并且可以按照所讨论的多种不同方式进行定义某些参数
:apply
的最后一个参数共享结构
我觉得有人可能会做出类似于
(defun applyfun(fn)(lambda(lst)(apply fn lst))
的东西,但我不相信这个名字是对的。@Sylwester:是的,添加了部分应用程序
,谢谢你的建议。你可以用(defun curry(f&rest args)(lambda(&rest more args))将其概括为一个完整的咖喱函数(应用f(附加参数更多参数)))
(mapcar (partial-application #'apply #'+) matrix)
==> (3 6 9)