Матричные операции
Предположим, что мы представляем векторы
v = (vᵢ)
как последовательности чисел, а матрицы
m = (mᵢⱼ)
как последовательности векторов (рядов матрицы). Например, матрица
представляется в виде последовательности
((1 2 3 4) (4 5 6 6) (6 7 8 9))
. Имея такое представление, мы можем использовать операции над последовательностями, чтобы кратко выразить основные действия над матрицами и векторами. Эти операции (описанные в любой книге по матричной алгебре) следующие:
(dot-product v w)
возвращает сумму
∑ᵢvᵢwᵢ
(matrix-*-vector m v)
возвращает вектор
t
, где
tᵢ = ∑ⱼmᵢⱼvᵢ
(matrix-*-matrix m n)
возвращает матрицу
p
, где
pᵢⱼ = ∑ₖmᵢₖnₖⱼ
(transpose m)
возвращает матрицу
n
, где
nᵢⱼ = mⱼᵢ
Скалярное произведение мы можем определить так:
(define (dot-product v w)
(accumulate + 0 (map * v w)))
Заполните пропуски в следующих процедурах для вычисления остальных матричных операций. (Процедура
accumulate-n
описана в упражнении
2.36
.)
(define (matrix-*-vector m v)
(map <??> m))
(define (transpose mat)
(accumulate-n <??> <??> mat))
(define (matrix-*-matrix m n)
(let ((cols (transpose n)))
(map <??> m)))
Комментарии отсутствуют.