mdeterminant   xtlang


Defined in:  https://github.com/digego/extempore/tree/v0.8.9/libs/core/math.xtm

Implementation

(bind-func mdeterminant
  "matrix determinant - matrix must be square (= nrows ncols)"
  (lambda (m1:double* nrows:i64)
    (if (= nrows 1) (pref m1 0)
        (let ((det:double 0.0) (s:double 1.0)
              (c 0) (i 0) (j 0) (m 0) (n 0)
              (mb:double* (salloc (* nrows nrows))))
          (dotimes (c nrows)
            (set! m 0) (set! n 0)
            (dotimes (i nrows)
              (dotimes (j nrows)
                (pset! mb (+ (* i nrows) j) 0.0)
                (if (and (<> i 0) (<> j c))
                    (begin
                      (pset! mb (+ (* m (- nrows 1)) n)
                             (pref m1 (+ (* i nrows) j)))
                      (if (< n (- nrows 2))
                          (set! n (+ n 1))
                          (begin
                            (set! n 0)
                            (set! m (+ m 1)))))
                    (begin 1))))
            (set! det (+ det (* s (* (pref m1 c)
                                     (mdeterminant mb (- nrows 1))))))
            (set! s (* -1.0 s)))
          det))))


Back to Index

Similar Entries