Решение упражнения 2.37 из SICP
Это упражнение может показаться сложноватым тем, кто не знаком с матричной арифметикой. На самом деле в ней нет абсолютно ничего сложного, но в нее нужно “въехать”, для чего вручную на бумажке поперемножать матрицы на вектора и другие матрицы. Без этого не удастся прочувствовать формулы и они останутся сухими и безжизненными. Кроме того, неплохо было бы изучить, какие приложения теория матриц находит в практических задачах. То есть я хочу сказать, что затронутая тема весьма обширна.
Возвращаясь к упражнению, сами операции доопределить несложно:
(define (matrix-*-vector m v) (map (lambda (row) (dot-product row v)) m))
(define (transpose mat) (accumulate-n cons nil mat))
(define (matrix-*-matrix m n)
(let ((cols (transpose n)))
(map (lambda (row) (matrix-*-vector cols row)) m)))
Хочу особо отметить транспонирование как чрезвычайно элегантный пример использования накопления.
Write a comment