matrix multiplication

  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.
  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.

scheme แบบถึก ช้า ยาว เปลืองหน่วยความจำ
แค่พยายามจะ functional + list

(define (empty? l)
  (= (length l) 0))
 
(define (tr mat)
  (define (prepare row)
    (if (empty? row) 
        (list)
        (cons (list)
              (prepare (cdr row)))))  
 
  (define (col-iter row tmat)
    (cond
      ((> (length row) 0)
       (cons (cons (car row)
                   (car tmat))
             (col-iter (cdr row)
                       (cdr tmat))))      
      (else null)))
 
  (define (row-iter mat tmat)
    (cond 
      ((> (length mat) 0) (row-iter (cdr mat)         
                                    (col-iter (car mat) 
                                              tmat)))       
      (else tmat)))
 
  (row-iter (reverse mat) 
            (prepare (car mat))))
 
(define (mul a b)
  (define (b-row-iter ra rtb)
    (if (empty? rtb)
        0
        (+ (* (car ra)
              (car rtb))
           (b-row-iter (cdr ra)
                       (cdr rtb)))))
 
  (define (col-iter ra tb)
    (if (empty? tb)
        null
        (cons (b-row-iter ra
                          (car tb))
              (col-iter ra
                        (cdr tb)))))
 
  (define (row-iter a tb)
    (if (empty? a) 
        (list)
        (cons (col-iter (car a)
                        tb)
              (row-iter (cdr a) 
                        tb))))
 
  (row-iter a 
            (tr b)))
 
(define a (list (list 1 2)
                (list 3 4)
                (list 5 6)
                (list 7 8)))
 
(define b (list (list 10 20 30)
                (list 40 50 60)))
(mul a b)
veer's picture

พยายามใช้ lambda foldl และ map เผื่อจะสั้นลง

(define (tp a)
  (foldl (lambda (ra ans)
           (map cons 
                ra
                ans))         
         (foldl (lambda (x ans)
                  (cons (list) ans)) 
                (list) 
                (car a))
         (reverse a)))
 
 
(define (mul_ a tb)
  (foldl (lambda (ra ans) 
           (cons (reverse (foldl (lambda (rtb ans)
                                   (cons (foldl + 
                                                0 
                                                (map * rtb ra))
                                         ans))
                                 (list)
                                 tb))
                 ans))
         (list)
         a))
 
(define (mul a b) 
  (mul_ (reverse a) 
        (tp b)))
 
 
(define a (list (list 1 2)
                (list 3 4)
                (list 5 6)
                (list 7 8)))
 
(define b (list (list 10 20 30)
                (list 40 50 60)))
 
(mul a b)
veer's picture

ใช้คำว่า iter น่าจะไม่ค่อยถูกด้วย ....

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น