Решение упражнения 2.37 из SICP

30 January, 2008 (22:32) | Решения упражнений

Это упражнение может показаться сложноватым тем, кто не знаком с матричной арифметикой. На самом деле в ней нет абсолютно ничего сложного, но в нее нужно “въехать”, для чего вручную на бумажке поперемножать матрицы на вектора и другие матрицы. Без этого не удастся прочувствовать формулы и они останутся сухими и безжизненными. Кроме того, неплохо было бы изучить, какие приложения теория матриц находит в практических задачах. То есть я хочу сказать, что затронутая тема весьма обширна.

Возвращаясь к упражнению, сами операции доопределить несложно:

(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)))

Хочу особо отметить транспонирование как чрезвычайно элегантный пример использования накопления.

Comments

Comment from AG
Date: April 1, 2012, 9:25 pm

У меня была опечатка в формуле произведения матрицы и вектора. Должно быть Ti=Sj Mij Vj

Write a comment