cg-Cad

Lisp »Tips 'n Tricks »Lisp & Array »1 »2 »3 »4 »5 »6 »7 »8 »9 »10

Un vincolo fondamentale per eseguire la moltiplicazione è che il numero di colonne della prima matrice deve essere uguale al numero di righe della seconda matrice.
L'elemento cij della matrice prodotto C è dato dalla somma dei prodotti degli elementi della riga i della matrice A per gli elementi della colonna j della matrice B.
Il lisp M2mq implementa questo algoritmo nel caso particolare della moltiplicazione di due matrici quadrate NxN.

M2MQ

;|
   M2MQ.LSP
   Copyright (C) 2005 Claudio Piccini.
   All rights reserved
   www.cg-cad.com

   Moltiplica gli Elementi di 2 Matrici NxN
|;

(defun lstArray ( N nome / i j L X e str ) 
 (setq i 0)
 (while (< i N)
  (setq j 0)
  (while (< j N)
   (setq str (strcat "\n Inserire elemento " nome "[" (itoa i) "],[" (itoa j) "]: ")) 
   (setq e (getreal str))
   (setq L (append L (list e)))
   (setq j (1+ j))
  )
  (setq X (append X (list L)))
  (setq L nil)
  (setq i (1+ i))
 )
 (princ "\n")
 (setq X X)
)

;|
    mostra il contenuto della lista 'matrice' nome
|;
(defun scriveArray ( N nome lista / i j e str )
 (setq i 0)
 (while (< i N)
  (setq j 0)
  (while (< j N)
   (setq e (nth j (nth i lista)))
   (setq str (strcat nome "[" (itoa i) "],[" (itoa j) "]=" (rtos e 2 2))) 
   (princ str)
   (setq j (1+ j))
  )
  (princ "\n")
  (setq i (1+ i))
 )
 (princ "\n")
)

(defun p2Ar ( N A B / i j k e1 e2 e3 L X )
 (setq i 0)
 (while (< i N)
  (setq j 0)
  (while (< j N)
   (setq e3 0)
   (setq k 0)
   (while (< k N)
    (setq e1 (nth k (nth i A)))
    (setq e2 (nth j (nth k B)))
    (setq e3 (+ e3 (* e1 e2)))
    (setq k (1+ k))
   )
   (setq L (append L (list e3)))
   (setq j (1+ j))
  )
  (setq X (append X (list L)))
  (setq L nil)
  (setq i (1+ i))
 )
 (setq X X)
)

(defun c:m2mq ( / N A B C )
 ; eco OFF
 (setvar "cmdecho" 0)
 ;|
    input A
    numero righe = N
 |;
 (princ "\n Matrice A:")
 (setq N (getint "\n numero righe [3]: "))
 (if (= N nil)(setq N 3))
 ;|
    inizializza la lista 'array' A
 |;
 (princ "\n Inizializzazione matrice A")
 (setq A (lstArray N " A"))
 ;|
    inizializza la lista 'array' B
 |;
 (princ "\n Inizializzazione matrice B")
 (setq B (lstArray N " B"))
 ;|
    mostra il contenuto dell'array A
 |;
 (scriveArray N " A" A)
 ;|
    mostra il contenuto dell'array B
 |;
 (scriveArray N " B" B)
 ;|
    moltiplica gli elementi dell'array A
    per gli elementi dell'array B
 |;
 (setq C (p2Ar N A B))
 ;|
    mostra il contenuto dell'array C=A*B
 |;
 (princ "\n C=A*B\n")
 (scriveArray N " C" C)
 ;| 
    ripristina l'ambiente
 |;
 (setvar "cmdecho" 1)
 (princ)
)
;;;eof

Test del Lisp

Command: m2mq
Matrice A:
numero righe [3]: 2

Inizializzazione matrice A
Inserire elemento A[0],[0]: 1
Inserire elemento A[0],[1]: 2
Inserire elemento A[1],[0]: 3
Inserire elemento A[1],[1]: 4

Inizializzazione matrice B
Inserire elemento B[0],[0]: 1
Inserire elemento B[0],[1]: -1
Inserire elemento B[1],[0]: 2
Inserire elemento B[1],[1]: 3

A[0],[0]=1 A[0],[1]=2
A[1],[0]=3 A[1],[1]=4

B[0],[0]=1 B[0],[1]=-1
B[1],[0]=2 B[1],[1]=3

C=A*B
C[0],[0]=5 C[0],[1]=5
C[1],[0]=11 C[1],[1]=9

M2M

Questo lisp implementa l'algoritmo nel caso generale, cioè con il numero di colonne della seconda matrice B immesso dall'utente.
Le modifiche apportate al codice sorgente, rispetto al lisp precedente sono di colore blu.

;|
   M2M.LSP
   Copyright (C) 2005 Claudio Piccini.
   All rights reserved
   www.cg-cad.com

   Moltiplica gli Elementi di 2 Matrici MxN
|;

(defun lstArray ( NR NC nome / i j L X e str ) 
 (setq i 0)
 (while (< i NR)
  (setq j 0)
  (while (< j NC)
   (setq str (strcat "\n Inserire elemento " nome "[" (itoa i) "],[" (itoa j) "]: ")) 
   (initget 1)
   (setq e (getreal str))
   (setq L (append L (list e)))
   (setq j (1+ j))
  )
  (setq X (append X (list L)))
  (setq L nil)
  (setq i (1+ i))
 )
 (princ "\n")
 (setq X X)
)

;|
    mostra il contenuto della lista 'matrice' nome
|;
(defun scriveArray ( NR NC nome lista / i j e str )
 (setq i 0)
 (while (< i NR)
  (setq j 0)
  (while (< j NC)
   (setq e (nth j (nth i lista)))
   (setq str (strcat nome "[" (itoa i) "],[" (itoa j) "]=" (rtos e 2 2))) 
   (princ str)
   (setq j (1+ j))
  )
  (princ "\n")
  (setq i (1+ i))
 )
 (princ "\n")
)

(defun p2Ar ( NR NC NCK A B / i j k e1 e2 e3 L X )
 (setq i 0)
 (while (< i NR)
  (setq j 0)
  (while (< j NC)
   (setq e3 0)
   (setq k 0)
   (while (< k NCK)
    (setq e1 (nth k (nth i A)))
    (setq e2 (nth j (nth k B)))
    (setq e3 (+ e3 (* e1 e2)))
    (setq k (1+ k))
   )
   (setq L (append L (list e3)))
   (setq j (1+ j))
  )
  (setq X (append X (list L)))
  (setq L nil)
  (setq i (1+ i))
 )
 (setq X X)
)

(defun c:m2m ( / NR1 NC1 ; matrice A
                 NC2     ; matrice B
                 A B C
 )
 ; eco OFF
 (setvar "cmdecho" 0)
 ;|
    input A
          numero righe   = NR1
          numero colonne = NC1
    input B
          numero colonne = NC2
 |;
 (princ "\n Matrice A:")
 (setq NR1 (getint "\n numero righe [3]: "))
 (if (= NR1 nil)(setq NR1 3))
 (setq NC1 (getint "\n numero colonne [4]: "))
 (if (= NC1 nil)(setq NC1 4))
 (princ "\n Matrice B:")
 (setq NC2 (getint "\n numero colonne [4]: "))
 (if (= NC2 nil)(setq NC2 4))
 ;|
    inizializza la lista 'array' A
 |;
 (princ "\n Inizializzazione matrice A")
 (setq A (lstArray NR1 NC1 " A"))
 ;|
    inizializza la lista 'array' B
 |;
 (princ "\n Inizializzazione matrice B")
 (setq B (lstArray NC1 NC2 " B"))
 ;|
    mostra il contenuto dell'array A
 |;
 (scriveArray NR1 NC1 " A" A)
 ;|
    mostra il contenuto dell'array B
 |;
 (scriveArray NC1 NC2 " B" B)
 ;|
    moltiplica gli elementi dell'array A
    per gli elementi dell'array B
 |;
 (setq C (p2Ar NR1 NC2 NC1 A B))
 ;|
    mostra il contenuto dell'array C=A*B
 |;
 (princ "\n C=A*B\n")
 (scriveArray NR1 NC2 " C" C)
 ;| 
    ripristina l'ambiente
 |;
 (setvar "cmdecho" 1)
 (princ)
)
;;;eof

Test del Lisp

Command: m2m
Matrice A:
numero righe [3]: 1
numero colonne [4]: 3

Matrice B:
numero colonne [4]: 1

Inizializzazione matrice A
Inserire elemento A[0],[0]: 1
Inserire elemento A[0],[1]: -4
Inserire elemento A[0],[2]: 5

Inizializzazione matrice B
Inserire elemento B[0],[0]: 4
Inserire elemento B[1],[0]: 3
Inserire elemento B[2],[0]: 2

A[0],[0]=1 A[0],[1]=-4 A[0],[2]=5

B[0],[0]=4
B[1],[0]=3
B[2],[0]=2

C=A*B
C[0],[0]=2

Command: m2m
Matrice A:
numero righe [3]: 2
numero colonne [4]: Invio

Matrice B:
numero colonne [4]: 2

Inizializzazione matrice A
Inserire elemento A[0],[0]: 1
Inserire elemento A[0],[1]: 2
Inserire elemento A[0],[2]: -1
Inserire elemento A[0],[3]: 1
Inserire elemento A[1],[0]: 3
Inserire elemento A[1],[1]: 4
Inserire elemento A[1],[2]: 2
Inserire elemento A[1],[3]: 0

Inizializzazione matrice B
Inserire elemento B[0],[0]: 1
Inserire elemento B[0],[1]: -1
Inserire elemento B[1],[0]: 2
Inserire elemento B[1],[1]: 3
Inserire elemento B[2],[0]: 0
Inserire elemento B[2],[1]: 1
Inserire elemento B[3],[0]: -1
Inserire elemento B[3],[1]: 2

A[0],[0]=1 A[0],[1]=2 A[0],[2]=-1 A[0],[3]=1
A[1],[0]=3 A[1],[1]=4 A[1],[2]=2 A[1],[3]=0

B[0],[0]=1 B[0],[1]=-1
B[1],[0]=2 B[1],[1]=3
B[2],[0]=0 B[2],[1]=1
B[3],[0]=-1 B[3],[1]=2

C=A*B
C[0],[0]=4 C[0],[1]=6
C[1],[0]=11 C[1],[1]=11

Command: m2m
Matrice A:
numero righe [3]: 4
numero colonne [4]: 1

Matrice B:
numero colonne [4]: 3

Inizializzazione matrice A
Inserire elemento A[0],[0]: 1
Inserire elemento A[1],[0]: 2
Inserire elemento A[2],[0]: 3
Inserire elemento A[3],[0]: 4

Inizializzazione matrice B
Inserire elemento B[0],[0]: 5
Inserire elemento B[0],[1]: 6
Inserire elemento B[0],[2]: 7

A[0],[0]=1
A[1],[0]=2
A[2],[0]=3
A[3],[0]=4

B[0],[0]=5 B[0],[1]=6 B[0],[2]=7

C=A*B
C[0],[0]=5 C[0],[1]=6 C[0],[2]=7
C[1],[0]=10 C[1],[1]=12 C[1],[2]=14
C[2],[0]=15 C[2],[1]=18 C[2],[2]=21
C[3],[0]=20 C[3],[1]=24 C[3],[2]=28

Command: m2m
Matrice A:
numero righe [3]: 2
numero colonne [4]: 2

Matrice B:
numero colonne [4]: 2

Inizializzazione matrice A
Inserire elemento A[0],[0]: 2
Inserire elemento A[0],[1]: -2
Inserire elemento A[1],[0]: 1
Inserire elemento A[1],[1]: -1

Inizializzazione matrice B
Inserire elemento B[0],[0]: 2
Inserire elemento B[0],[1]: -2
Inserire elemento B[1],[0]: 1
Inserire elemento B[1],[1]: -1

A[0],[0]=2 A[0],[1]=-2
A[1],[0]=1 A[1],[1]=-1

B[0],[0]=2 B[0],[1]=-2
B[1],[0]=1 B[1],[1]=-1

C=A*B
C[0],[0]=2 C[0],[1]=-2
C[1],[0]=1 C[1],[1]=-1

Esempio di matrice idempotente, A=B A2=A

Command: m2m
Matrice A:
numero righe [3]: 2
numero colonne [4]: 2

Matrice B:
numero colonne [4]: 2

Inizializzazione matrice A
Inserire elemento A[0],[0]: 6
Inserire elemento A[0],[1]: 4
Inserire elemento A[1],[0]: -9
Inserire elemento A[1],[1]: -6

Inizializzazione matrice B
Inserire elemento B[0],[0]: 6
Inserire elemento B[0],[1]: 4
Inserire elemento B[1],[0]: -9
Inserire elemento B[1],[1]: -6

A[0],[0]=6 A[0],[1]=4
A[1],[0]=-9 A[1],[1]=-6

B[0],[0]=6 B[0],[1]=4
B[1],[0]=-9 B[1],[1]=-6

C=A*B
C[0],[0]=0 C[0],[1]=0
C[1],[0]=0 C[1],[1]=0

Esempio di matrice nilpotente, A=B A2=0

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 19 Giugno 2005