vector - 给定向量列表的质心

标签 vector lisp common-lisp

我必须计算给定向量列表的平均向量,例如这个向量

'((2 3 56) (22 45 34) (21 2 23) (4 8 3) (4 4 1) (4 4 5))

简而言之,我必须找到给定列表列表的质心。

(defun vsum (x y)
 (cond ((not (= (list-length x) (list-length y))) (error "dimension error!"))
   ((null (first x)) NIL)
       (t (cons (+ (first x) (first y)) (vsum (rest x) (rest y))))))

我已经创建了这个简单的函数,但是我在以递归方式使用它(我更喜欢它反对循环)来完成我的任务时遇到了很大的麻烦。我也需要它与维度无关(例如,大多数大小为 2 或 3 的向量)。

最佳答案

在这种情况下不需要循环或递归,只需要原始泛函:

(defun centroid (list)
  (when list
    (let ((list-length (length list))
          (dimension (length (first list))))
      (unless (every (lambda (v) (= (length v) dimension)) (rest list))
        (error "Dimension error!"))
      (mapcar (lambda (x) (/ x list-length))
              (reduce (lambda (x y) (mapcar #'+ x y)) list)))))

使用的公式是针对有限点集的公式(参见 Wikipedia)。

首先检查所有向量是否具有相同的维度(every 的部分),然后使用 (reduce (lambda (x y) ( mapcar #'+ x y)) list)部分,最后每个坐标除以点数(mapcar部分)。

关于vector - 给定向量列表的质心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39222225/

相关文章:

c++ - 我可以在超出范围后保留 vector 数据吗

c++ - 使用对 vector 时出现无效、错误的数字模板参数错误

lisp - SICP 的 Racket 博士问题

lisp - 什么时候在Lisp中使用'(或引用)?

方案 :Dealing with lists within lists

python - python argparse 的 common-lisp 类似物是什么?

lisp - 常见的 lisp 符号匹配

c++ - 类范围问题的 vector ?

list - 如何比较 Lisp 中的两个列表

c++ - 在 C++ 中使用 std::vector<bool> 对象是否可以接受,还是应该使用替代方法?