Násobení matic, varianta 2346234653452345132tá#
Ve scheme naprogramujte násobení matic libovolné (i obdélníkové)
velikosti.
Matice obsahují jen normální čísla, a jsou reprezentované jako seznamy
seznamů
po řádkových vektorech, tj. identitní matice 3x3 je reprezentovaná
'((1 0 0)(0 1 0)(0 0 1))
.
Snažte se o nejkratší a nejhezčí kód (ne nutně nejrychlejší nebo
nejodolnější)
a co nejlepší využití předdefinovaných funkcí — hodit se může
(map)
,
(zip)
, (list)
, (foldl)
a případně (apply)
nebo (andmap)
.
Většina z
těchto funkcí (hlavně map a zip) jde aplikovat na libovolný počet
parametrů,
což se dost hodí např. při transponování matic.
Pokud je vstup chybný, můžete způsobit nedefinované chování (volně přeloženo, neřešte to).
Výslednou funkci pojmenujte mult-mtx
. Funkce by měla umět zpracovat
více parametrů, všechny parametry jsou matice které by se měly vynásobit
postupně.
Příklad#
Fungovat by to mělo zhruba takhle:
λ> (mult-mtx '((1 2)
(3 4)
(1 0)
(0 1))
'((1 2 3)
(4 5 6))
'((1 0 0)
(0 0 1)
(0 1 0)))
'((9 15 12) (19 33 26) (1 3 2) (4 6 5))
Hint#
Q: Jak vyrobit funkci s variabilním množstvím parametrů?
A: V definici funkce vyrobíte něco jako pattern-match na tělo seznamu argumentů.
(define (print-all-args . x)
(for-each (lambda (x)
(begin (print x)
(newline)))
x))