(FILECREATED "29-Aug-86 15:55:35" {QV}<PEDERSEN>LISP>MATRIXTIMES.;1 9608         changes to:  (VARS MATRIXTIMESCOMS)                   (FUNCTIONS MATRIX-* MATRIX-VECTOR-* VECTOR-MATRIX-* VECTOR-VECTOR-*                           MATRIX-MATRIX-*))(* Copyright (c) 1986 by Xerox Corporation. All rights reserved.)(PRETTYCOMPRINT MATRIXTIMESCOMS)(RPAQQ MATRIXTIMESCOMS ((* File created by Coms Manager.)                        (FUNCTIONS MATRIX-* MATRIX-MATRIX-* MATRIX-VECTOR-* VECTOR-MATRIX-*                                VECTOR-VECTOR-*)                        (PROP FILETYPE MATRIXTIMES)                        (DECLARE: DONTCOPY EVAL@COMPILE (LOCALVARS . T))))(* File created by Coms Manager.)(DEFUN MATRIX-* (MATRIX-A MATRIX-B &OPTIONAL MATRIX-RESULT) (CL:IF (VECTORP MATRIX-A)                                                                   (CL:IF (VECTORP MATRIX-B)                                                                          (VECTOR-VECTOR-* MATRIX-A                                                                                  MATRIX-B)                                                                          (VECTOR-MATRIX-* MATRIX-A                                                                                  MATRIX-B                                                                                  MATRIX-RESULT))                                                                   (CL:IF (VECTORP MATRIX-B)                                                                          (MATRIX-VECTOR-* MATRIX-A                                                                                  MATRIX-B                                                                                  MATRIX-RESULT)                                                                          (MATRIX-MATRIX-* MATRIX-A                                                                                  MATRIX-B                                                                                  MATRIX-RESULT))))(DEFUN MATRIX-MATRIX-* (MATRIX-A MATRIX-B &OPTIONAL MATRIX-RESULT)   (CL:IF (NOT (TYPEP MATRIX-A (QUOTE (ARRAY SINGLE-FLOAT (CL:* CL:*)))))          (CL:ERROR "Not a float matrix: ~S" MATRIX-A))   (CL:IF (NOT (TYPEP MATRIX-B (QUOTE (ARRAY SINGLE-FLOAT (CL:* CL:*)))))          (CL:ERROR "Not a float matrix: ~S" MATRIX-B))   (LET ((M (ARRAY-DIMENSION MATRIX-A 0))         (N (ARRAY-DIMENSION MATRIX-A 1))         (P (ARRAY-DIMENSION MATRIX-B 1)))        (CL:IF (NOT (EQL N (ARRAY-DIMENSION MATRIX-B 0)))               (CL:ERROR "Dimensionality mismatch"))        (CL:IF MATRIX-RESULT (CL:IF (AND (TYPEP MATRIX-RESULT (QUOTE (ARRAY SINGLE-FLOAT (CL:* CL:*))                                                                     ))                                         (EQL M (ARRAY-DIMENSION MATRIX-RESULT 0))                                         (EQL P (ARRAY-DIMENSION MATRIX-RESULT 1)))                                    MATRIX-RESULT                                    (CL:ERROR "Result array of incorrect type: ~s" MATRIX-RESULT))               (SETQ MATRIX-RESULT (MAKE-ARRAY (LIST M P)                                          :ELEMENT-TYPE                                          (QUOTE SINGLE-FLOAT))))        (CL:DO ((A-BASE (%%GET-FLOAT-ARRAY-BASE MATRIX-A))                (B-BASE (%%GET-FLOAT-ARRAY-BASE MATRIX-B))                (R-BASE (%%GET-FLOAT-ARRAY-BASE MATRIX-RESULT))                (TWICE-M (LLSH M 1))                (TWICE-N (LLSH N 1))                (TWICE-P (LLSH P 1))                (A-START 0 (+ A-START TWICE-N))                (R-START 0 (+ R-START TWICE-P))                (I 0 (1+ I)))               ((EQL I M)                MATRIX-RESULT)               (CL:DO ((B-START 0 (+ B-START 2))                       (R-INDEX R-START (+ R-INDEX 2))                       (K 0 (1+ K)))                      ((EQL K P))                      (CL:DO ((A-INDEX A-START (+ A-INDEX 2))                              (B-INDEX B-START (+ B-INDEX TWICE-P))                              (J 0 (1+ J))                              (PRODUCT 0.0))                             ((EQL J N)                              (\PUTBASEFLOATP R-BASE R-INDEX PRODUCT))                             (DECLARE (TYPE FLOATP PRODUCT))                             (SETQ PRODUCT (+ PRODUCT (CL:* (\GETBASEFLOATP A-BASE A-INDEX)                                                            (\GETBASEFLOATP B-BASE B-INDEX)))))))))(DEFUN MATRIX-VECTOR-* (MATRIX VECTOR &OPTIONAL VECTOR-RESULT) "Multiply a matrix times a vector"   (CL:IF (NOT (TYPEP MATRIX (QUOTE (ARRAY SINGLE-FLOAT (CL:* CL:*)))))          (CL:ERROR "Not a float matrix: ~S" MATRIX))   (CL:IF (NOT (TYPEP VECTOR (QUOTE (VECTOR SINGLE-FLOAT))))          (CL:ERROR "Not a float vector: ~S" VECTOR))   (LET ((M (ARRAY-DIMENSION MATRIX 0))         (N (ARRAY-DIMENSION MATRIX 1)))        (CL:IF (NOT (EQL N (ARRAY-TOTAL-SIZE VECTOR)))               (CL:ERROR "Dimensionality mismatch"))        (CL:IF VECTOR-RESULT (CL:IF (AND (TYPEP VECTOR-RESULT (QUOTE (VECTOR SINGLE-FLOAT)))                                         (EQL M (ARRAY-TOTAL-SIZE VECTOR-RESULT)))                                    VECTOR-RESULT                                    (CL:ERROR "Result array of incorrect type: ~s" VECTOR-RESULT))               (SETQ VECTOR-RESULT (MAKE-VECTOR M :ELEMENT-TYPE (QUOTE SINGLE-FLOAT))))        (CL:DO ((MATRIX-BASE (%%GET-FLOAT-ARRAY-BASE MATRIX))                (VECTOR-BASE (%%GET-FLOAT-ARRAY-BASE VECTOR))                (RESULT-BASE (%%GET-FLOAT-ARRAY-BASE VECTOR-RESULT))                (TWICE-M (LLSH M 1))                (TWICE-N (LLSH N 1))                (MATRIX-START 0 (+ MATRIX-START TWICE-N))                (R-INDEX 0 (+ R-INDEX 2))                (I 0 (1+ I)))               ((EQL I M)                VECTOR-RESULT)               (CL:DO ((M-INDEX MATRIX-START (+ M-INDEX 2))                       (V-INDEX 0 (+ V-INDEX 2))                       (PRODUCT 0.0)                       (J 0 (1+ J)))                      ((EQL J N)                       (\PUTBASEFLOATP RESULT-BASE R-INDEX PRODUCT))                      (DECLARE (TYPE FLOATP PRODUCT))                      (SETQ PRODUCT (+ PRODUCT (CL:* (\GETBASEFLOATP MATRIX-BASE M-INDEX)                                                     (\GETBASEFLOATP VECTOR-BASE V-INDEX))))))))(DEFUN VECTOR-MATRIX-* (VECTOR MATRIX &OPTIONAL VECTOR-RESULT) "Multiply a vector and a matrix"   (CL:IF (NOT (TYPEP VECTOR (QUOTE (VECTOR SINGLE-FLOAT))))          (CL:ERROR "Not a float vector: ~S" VECTOR))   (CL:IF (NOT (TYPEP MATRIX (QUOTE (ARRAY SINGLE-FLOAT (CL:* CL:*)))))          (CL:ERROR "Not a float matrix: ~S" MATRIX))   (LET ((N (ARRAY-TOTAL-SIZE VECTOR))         (P (ARRAY-DIMENSION MATRIX 1)))        (CL:IF (NOT (EQL N (ARRAY-DIMENSION MATRIX 0)))               (CL:ERROR "Dimensionality mismatch"))        (CL:IF VECTOR-RESULT (CL:IF (AND (TYPEP VECTOR-RESULT (QUOTE (VECTOR SINGLE-FLOAT)))                                         (EQL P (ARRAY-TOTAL-SIZE VECTOR-RESULT)))                                    VECTOR-RESULT                                    (CL:ERROR "Result array of incorrect type: ~s" VECTOR-RESULT))               (SETQ VECTOR-RESULT (MAKE-VECTOR P :ELEMENT-TYPE (QUOTE SINGLE-FLOAT))))        (CL:DO ((VECTOR-BASE (%%GET-FLOAT-ARRAY-BASE VECTOR))                (MATRIX-BASE (%%GET-FLOAT-ARRAY-BASE MATRIX))                (RESULT-BASE (%%GET-FLOAT-ARRAY-BASE VECTOR-RESULT))                (TWICE-N (LLSH N 1))                (TWICE-P (LLSH P 1))                (R-INDEX 0 (+ R-INDEX 2))                (MATRIX-START 0 (+ MATRIX-START 2))                (I 0 (1+ I)))               ((EQL I P)                VECTOR-RESULT)               (DECLARE (TYPE FLOATP VECTOR-ELT))               (CL:DO ((V-INDEX 0 (+ V-INDEX 2))                       (M-INDEX MATRIX-START (+ M-INDEX TWICE-P))                       (PRODUCT 0.0)                       (J 0 (1+ J)))                      ((EQL J N)                       (\PUTBASEFLOATP RESULT-BASE R-INDEX PRODUCT))                      (DECLARE (TYPE FLOATP PRODUCT))                      (SETQ PRODUCT (+ PRODUCT (CL:* (\GETBASEFLOATP VECTOR-BASE V-INDEX)                                                     (\GETBASEFLOATP MATRIX-BASE M-INDEX))))))))(DEFUN VECTOR-VECTOR-* (VECTOR-A VECTOR-B) "Multiply two vectors"   (CL:IF (NOT (TYPEP VECTOR-A (QUOTE (VECTOR SINGLE-FLOAT))))          (CL:ERROR "Not a float vector: ~S" VECTOR-A))   (CL:IF (NOT (TYPEP VECTOR-B (QUOTE (VECTOR SINGLE-FLOAT))))          (CL:ERROR "Not a float vector: ~S" VECTOR-B))   (LET ((N (ARRAY-TOTAL-SIZE VECTOR-A)))        (CL:IF (NOT (EQL N (ARRAY-TOTAL-SIZE VECTOR-B)))               (CL:ERROR "Dimensionality mismatch"))        (CL:DO ((A-BASE (%%GET-FLOAT-ARRAY-BASE VECTOR-A))                (B-BASE (%%GET-FLOAT-ARRAY-BASE VECTOR-B))                (PRODUCT 0.0)                (LIMIT (LLSH N 1))                (I 0 (+ I 2)))               ((EQL I LIMIT)                PRODUCT)               (DECLARE (TYPE FLOATP PRODUCT))               (SETQ PRODUCT (+ PRODUCT (CL:* (\GETBASEFLOATP A-BASE I)                                              (\GETBASEFLOATP B-BASE I)))))))(PUTPROPS MATRIXTIMES FILETYPE COMPILE-FILE)(DECLARE: DONTCOPY EVAL@COMPILE (DECLARE: DOEVAL@COMPILE DONTCOPY(LOCALVARS . T)))(PUTPROPS MATRIXTIMES COPYRIGHT ("Xerox Corporation" 1986))(DECLARE: DONTCOPY  (FILEMAP (NIL)))STOP