Решение упражнения 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

Comment from Nizarath
Date: August 3, 2013, 8:24 pm

Без dot-product:

(define (matrix-*-vector m v)
(map (lambda (x) (accumulate + 0 (accumulate-n * 1 (list x v)))) m))

Comment from shini
Date: September 22, 2013, 10:38 pm


(define (transpose mat)
(accumulate-n cons nil mat))

У меня не работает. Язык – рэкет и scheme.
Функция accumulate жалуется на то что ожидает 2 аргумента – в то время как получает 1.

Comment from shini
Date: September 23, 2013, 10:44 am

Извеняюсь – у меня неправильная процедура accumulate-n.

Comment from Aera
Date: March 5, 2014, 9:05 pm

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

аналогично) Но пока это понял, пришлось “покурить” матричную арифметику.

Comment from oleg
Date: December 8, 2014, 5:40 am

matrix-*-matrix не выдает произведение матриц, для получения произведения, необходимо дополнительно транспонировать результат.

Comment from oleg
Date: December 8, 2014, 5:44 am

Ой, я ошибся в предыдущем комментарии. Произведение работает верно, извиняюсь.

Write a comment