我有两个矢量数组:
t1 (vector 1 2 3)
t2 (vector 1 2 3 6 4)
我只想将t1的值与t2相加 结果是这样的:
t2(2 4 6 6 4)
首先我尝试这段代码:
(defun addition-v2 (t1 t2)
(if(< (length t1) (length t2))
(do ((x 0 (+ 1 x)))
((>= x (length t1)) t2)
(setf (aref t2 x) (+ (aref t1 x) (aref t2 x))))))
就像你想象的那样结果是
#(2 4 6 6 4)
好的,但是如果长度为t1&gt;我该怎么办?长度为t2
答案 0 :(得分:1)
由于您破坏性地更新了t2,因此您可以使用MAP-INTO
。
(defun addition-v2 (t1 t2)
(when (> (length t1) (length t2))
(rotatef t1 t2))
(map-into t2 #'+ t1 t2))
答案 1 :(得分:0)
如果你想使用自下而上的&amp;功能性方法,这是它的外观:
(defun ensure-length (vec len)
(let ((vec-len (length vec)))
(if (< vec-len len)
(let ((result (make-array len
:initial-element 0)))
(dotimes (i vec-len)
(setf (elt result i)
(aref vec i)))
result)
vec)))
(defun ensure-lengths (vec1 vec2)
(values (ensure-length vec1 (length vec2))
(ensure-length vec2 (length vec1))))
(defun ensured-vector-add (vec1 vec2)
(multiple-value-bind (v1 v2)
(ensure-lengths vec1 vec2)
(map 'vector #'+ v1 v2)))
(defun ensured-vector-+ (&rest vs)
(reduce #'ensured-vector-add vs
:initial-value #()))
然后你可以调用(ensured-vector-+ t1 t2)
或者你有多少个载体。
答案 2 :(得分:-2)
最后在此行中找到了t1
或t2
大小的问题:
((>= x (length c)) t2)
(>= x (length c)
需要< length c
,因此我使用函数min
。
也许有其他解决方案,但这个有效!
(defun addition-v2 (t1 t2)
(if(< (length t1) (length t2))
(setq c t2)
(setq c t1))
(do ((x 0 (+ 1 x)))
((>= x (min (length t1) (length t2))) c)
(setf (aref t2 x) (+ (aref t1 x) (aref t2 x))))))