|
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
|
|