rix)
(let* ((m (car (matrix-dimensions matrix)))
(n (car (cdr (matrix-dimensions matrix))))
(new-matrix (matrix-make n m)))
(dotimes (i n)
(dotimes (j m)
(matrix-mod new-matrix i j (matrix-pos matrix j i))))
new-matrix))
;10、求矩阵中某个数的余子式
(defun yuzishi (matrix m n)
(let* ((k (car (matrix-dimensions matrix)))
(l (car (cdr (matrix-dimensions matrix))))
(new-matrix (matrix-make (- k 1) (- l 1))))
(dotimes (i (- k 1))
(dotimes (j (- l 1))
(cond ((and (< i m) (< j n)) (matrix-mod new-matrix i j
(matrix-pos matrix i j)))
((and (< i m) (>= j n)) (matrix-mod new-matrix i j
(matrix-pos matrix i (+ j 1))))
((and (>= i m) (< j n)) (matrix-mod new-matrix i j
(matrix-pos matrix (+ i 1) j)))
(t (matrix-mod new-matrix i j
(matrix-pos matrix (+ i 1) (+ j 1)))))))
new-matrix))
;11、能够计算某一元素的余子式
(defun matrix-sq (matrix n)
(let ((k (car (cdr (matrix-dimensions matrix)))))
(if (/= 2 k)
(* (expt -1 n) (matrix-pos matrix 0 n) (matrix-sq (yuzishi matrix 0 n) n))
(- (* (matrix-pos matrix 0 0) (matrix-pos matrix 1 1))
(* (matrix-pos matrix 0 1) (matrix-pos matrix 1 0))))))
;12、计算方阵的行列式值
(defun matrix-sq-end (matrix)
(let ((result 0)
(k (car (matrix-dimensions matrix))))
(if (/= k 3)
(dotimes (i k)
(setf result (+ result (matrix-sq-end (yuzishi matrix 0 i)))))
(dotimes (j 3)
(setf result (+ result (matrix-sq matrix j)))))
result))
;13、矩阵两行交换位置(无破坏性)
(defun matrix-row-exchange (matrix m n)
(let* ((k (car (cdr (matrix-dimensions matrix))))
(temp-row (make-array k))
(temp-matrix (matrix-copy matrix)))
(dotimes (i k)
(setf (svref temp-row i) (matrix-pos matrix m i))
(matrix-mod temp-matrix m i (matrix-pos matrix n i))
(matrix-mod temp-matrix n i (svref temp-row i)))
temp-matrix))
;14、将矩阵的某一行乘以某数(无破坏性)
(defun matrix-row-mul (matrix m n)
(let ((k (car (cdr (matrix-dimensions matrix))))
(temp-matrix (matrix-copy matrix)))
(dotimes (i k)
(matrix-mod temp-matrix m i (* (matrix-pos matrix m i) n)))
temp-matrix))
;15、求两个向量的内积
(defun inner-product (vec-1 vec-2)
(let ((v-1 (length vec-1))
(v-2 (length vec-2))
(result 0))
(if (/= v-1 v-2)
(format t "~a与~a的维数不同,不能求得内积!!!" vec-1 vec-2)
(dotimes (i v-1)
(setf result (+ result
(* (svref vec-1 i)
(svref vec-2 i))))))
result))
;15、复制一个矩阵
(defun matrix-copy (matrix)
(let* ((m (car (matrix-dimensions matrix)))
(n (car (cdr (matrix-dimensions matrix))))
(temp-matrix (matrix-make m n)))
(dotimes (i m)
(dotimes (j n)
(matrix-mod temp-matrix i j
(matrix-pos matrix i j))))
temp-