Сложение матрицы в схеме

Я пытаюсь добавить матрицу, но она не работает ...

(define (matrix-matrix-add a b)
  (map (lambda (row) (row-matrix-add row b))
       a))

(define (row-matrix-add row matrix)
  (if (null? (car matrix))
      '()
      (cons (add-m row (map car matrix))
            (row-matrix-add row (map cdr matrix)))))

(define (add-m row col)
  (if (null? col)
      0
      (+ (car row)
         (car col)
         (add-m (cdr row) (cdr col)))))

person Community    schedule 03.03.2010    source источник
comment
Что не работает? Вы получаете сообщение об ошибке?   -  person leppie    schedule 03.03.2010
comment
Он не делает того, что должен делать. В основном добавление неверное. Только начатая схема   -  person    schedule 03.03.2010


Ответы (2)


Вот очень короткая рабочая реализация. Карта хороша тем, что избавляется от слоя рекурсии, когда вы можете ее использовать.

(определить (матрица-добавить x y) (map (lambda (x y) (map + x y)) x y))

person Tom Murphy    schedule 28.02.2011

Вот рабочая реализация:

(define (matrix-add m1 m2)

  (define (matrix-add-row r1 r2 res-row)
    (if (and (not (null? r1)) (not (null? r2)))
    (matrix-add-row (cdr r1) (cdr r2)
            (cons (+ (car r1) (car r2)) res-row))
    (reverse res-row)))

  (define (matrix-add-each m1 m2 res)
    (if (and (not (null? m1)) (not (null? m2)))
    (let ((res-row (matrix-add-row (car m1) (car m2) ())))
      (matrix-add-each (cdr m1) (cdr m2) (cons res-row res)))
    (reverse res)))
  (matrix-add-each m1 m2 ()))

Пример использования и вывода:

>  (matrix-add '((7 2) (3 8)) '((4 8) (0 5)))
((11 10) (3 13))
> (matrix-add '((5 2) (4 9) (10 -3)) '((-11 0) (7 1) (-6 -8)))
((-6 2) (11 10) (4 -11))
person Vijay Mathew    schedule 04.03.2010
comment
Это ужасное решение. Делает это намного сложнее, чем есть на самом деле. - person Austin Derrow-Pinion; 03.04.2016