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