Tichý bard

Sčítání matic ve Scheme

Program umožňuje sčítání a transpozici matic, přičemž matice musí být zadána jako seznam seznamů (čili každý řádek matice je jeden seznam). Např.:

  • (define m '((1 2 3) (4 5 6) (7 8 9))) ; matice 3×3
  • (define v1 '((1 2 3))) ; matice 3×1
  • (define v2 '((1) (2) (3))) ; matice 1×3
  • (define c '((1))) ; matice 1×1

Vlastní sčítání se potom provede příkazem (add m n). Jako bonus jsem přidal funkci k transpozici matice. Někde jsem měl i násobení, ale bohužel ho nemohu najít. Ke spuštění programu matrix.scm můžete použít např. UMB Scheme.

Zdrojový kód

; return count of the rows
(define rows
  (lambda (m)
    (cond
     ((null? m) '())
     (else (length m)))
    ))

; return count of the columns
(define cols
  (lambda (m)
    (cond
     ((null? m) '())
     (else (length (car m))))
    ))

; return matrix dimension: (rows columns)
(define dimension
  (lambda (m)
    (cond
     ((null? m) '())
     (else (vector (rows m) (cols m))))
    ))

; check the matrix dimension and calls summing function
(define add
  (lambda (m1 m2)
    (cond
     ((equal? (dimension m1) (dimension m2)) (_add m1 m2))
     (else (error "dimension are not equal")))
    ))

; addition
(define _add
  (lambda (m1 m2)
    (cond
     ((or (null? m1) (null? m2)) '())
     ((and (list? m1) (list? m2))
      (cons (_add (car m1) (car m2)) (_add (cdr m1) (cdr m2))))
     (else (+ m1 m2)))
    ))

; transposition of the matrix
(define transp
  (lambda (m)
    (cond
      ((null? m) '())
      ((null? (car m)) '())
      ((list? (car m)) (cons (map car m) (transp (map cdr m))))
      (else (cons (list (car m)) (transp (cdr m)))))
    ))

Publikoval Salim, 2. 5. 2004 v 21:02

Petr „Salim“ Kinšt © 2003+

Focalize | © copyright free 2006