2015-05-31 2 views
1

Я пытаюсь размножить список с n подписок со списком с n скалярами. Он должен работать следующим образом:Попытка умножить все элементы в списке подписок с элементами в другом списке в lisp

(kmult-matrix '((3 4 2 4) (2 5 6 9) (1 -2 8 10)) '(2 3 5)) 
=> ((6 8 4 8) (6 15 18 27) (5 -10 40 50)) 

Каждый n-ю подсети умножается на n-й скаляр во втором списке. Вот что я получил это далеко:

(defun kmult-matrix (m k) 
    (apply 'append (mapcar (lambda (x1) 
      (mapcar (lambda (x2) 
          (mapcar (lambda (x3) 
            (* x3 x1)) 
            x2)) 
          m)) 
      k))) 

Каких результатов в:

((6 8 4 8) (4 10 12 18) (2 -4 16 20) (9 12 6 12) (6 15 18 27) (3 -6 24 30) (15 20 10 20) (10 25 30 45) (5 -10 40 50)) 

Надеется, что это нормально, чтобы спросить, это как это для распайки и у меня есть ощущение, что я не далек от решение. Кстати, я должен использовать mapcar.

ответ

3

Это намного проще, чем это. Помните, что mapcar может принимать более одного списка. Таким образом:

(defun kmult-matrix (m k) 
    (mapcar (lambda (list k) 
      ;; inside here you get a list and 
      ;; it's corresponding multiplier k 
      ...) 
      m 
      k)) 

Результат от внешней карты будет представлять собой список с таким количеством элементов, так как есть подсписки m (и соответствующие им элементы в k). Внутри лямбды вы делаете другую карту над lst, которая выполняет умножение на элемент. так что внутренняя карта производит один раз список ответов на элемент во внешней карте.

+0

Я чувствую себя таким немым прямо сейчас ... Большое спасибо;) –

Смежные вопросы