e-x-a.org » Úkol C

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