Newsgroup: it.comp.software.cad
Titolo: domanda: avete un utility in lisp o VBA per fare l'inverso di una matrice?

Vorrei fare l'inverso di una matrice,
mi potete rispondere.

 mi potete rispondere.
L'ho fatto.
Fammi sapere.
Se mi scrivi in privato ti do il telefono e se vuoi ne parliamo a voce.
Eccoti l'elenco delle principali procedure che ho sviluppato per la mia tesi
di laurea,
noterai che manca l'inversa, in realta' nel cassetto degli scarti c'e' pure
quella,
se proprio ti serve te la passo,  ma l'eliminazione di gauss e' di granlunga
piu' veloce.
Procedure sulle matrici.
----------------------------------------------------------------------------
----------------
? (MA-TRA M)
(MA-TRA-O M)
(MA-TRA-V M)
? MA-TRA. Traspone la Matrice M.
? MA-TRA-O. Riordina le colonne della Matrice M in ordine inverso.
? MA-TRA-V. Riordina le righe della Matrice M in ordine inverso.
? (MA-GET-R M r)
(MA-GET-C M c)
(MA-GET-E M r c)
? MA-GET-R. Estrae la riga di indice r dalla matrice M.
? MA-GET-C. Estrae la  colonna di indice c dalla matrice M.
? MA-GET-E. Estrae l'Elemento di indici r e c dalla matrice M.
? (MA-DEL-R M r)
(MA-DEL-C M c)
(MA-DEL-E M r c)
? MA-DEL-R. Elimina dalla Matrice M la riga di indice r.
? MA-DEL-C. Elimina dalla Matrice M la colonna di indice c.
? MA-DEL-E. Elimina dalla Matrice M la riga di indice r e la colonna di
indice c.
? (MA-MOD-R M r Mr)
(MA-MOD-C M c Mc)
(MA-MOD-E M r c Me)
? MA-MOD-R. Sostituisce la riga di indice r della matrice M con la matrice
riga Mr.
? MA-MOD-C. Sostituisce la colonna di indice c della matrice M con la
matrice colonna Mc.
? MA-MOD-E. Sostituisce l'elemento di indici r e c della matrice M con la
matrice elemento Me.
? (MA-APP-R M Mr)
(MA-APP-C M Mc)
? MA-APP-R. Appende alla matrice M una matrice riga Mr.
? MA-APP-C. Appende alla matrice M una matrice colonna Mc.
? (MA-PRO  Ma Mb)
(MA-TP Ma Mb)
? MA-PRO. Effettua il prodotto tra le matrici Ma Mb.
 (MA-PRO '((1 2 3) (2 4 6) (3 6 9))  '((0) (1) (2))) )    ?    ((8) (16)
(24))
? MA-TP. Procedura rapida di moltiplicazione tra due matrici Ma Mb, da
utilizzarsi solo nel caso in cui la seconda Mb sia una matrice colonna
espressa come lista di valori ovvero trasposta; tale procedura restituisce
la matrice colonna risultante come lista di valori ovvero trasposta. Si
confronti l'esempio riportato sotto col precedente:
 (MA-TP    '((1 2 3) (2 4 6) (3 6 9))  '(0 1 2)) )    ?    (8 16 24)
? (MA-NEG M)
? MA-NEG. Cambiamento di segno ogni elemento della matrice M.
? (MA-DIV-R # Mr)
? MA-DIV-R. Divide ogni elemento della riga Mr (di una matrice M) per il
numero fornito #.
? (MA-CROSS Ma Mb)
? MA-CROSS. Data la matrice Ma dei coefficienti e la matrice Mb dei termini
noti, restituisce la matrice Mx delle incognite. Per non rallentare il
calcolo, la procedura non effettua alcun controllo sulla invertibilità della
Matrice Ma. Negli esempi che seguono è corretto solo il primo risultato:
 (MA-CROSS '((1 1 1)(2 4 8)(1 2 4))'((1) (1) (1))) )     ?    ((0.0) (1.5)
(-0.5))
 (MA-CROSS '((1 1 1)(1 1 1)(1 1 1))'((1) (1) (1))) )     ?    ((1.0) (0.0)
(0.0))
 (MA-CROSS '((1 1 1)(1 1 1)(1 1 1))'((0) (0) (0))) )     ?    ((0.0) (0.0)
(0.0))
? (MA-PRINC  M)
? MA-PRINC. Visualizza al command di AutoCAD, la matrice M passata come
argomento, riformattandola per righe incolonnate verticalmente.
 (MA-PRINC '((11 12 13 14)(21 22 23 24) (31 32 33 34) (41 42 43 44)))
?
(11 12 13 14)
(21 22 23 24)
(31 32 33 34)
(41 42 43 44
----------------------------------------------------------------------------
----------------
--
Ciao Giovanni A.


grazie gerry ho scritto ad Anzani.
se sei curioso anche tu ti dirò che mi serve per trovare la matrice inversa
di trasformazione
della matrice di trasformazione relativa all'UCS.
Questo per mettere il ruotare tutti gli oggetti secondo un UCS che
diverrebbe il WCS.
Non ti capita mai di voler cambiare il punto di inserimento e l'orientamento
del WCS di un blocco?
ed è questa la mia applicazione. Ciao,
Pietro 1844.

Be in questo caso hai quasi ragione.
Quasi perche' comunque devi calcolare un sistema di 3 equazioni
che sono le coordinate dei punti nel sistema UCS.
Nel tuo caso l'inversa e' auspicabile
 in quanto dovrai sicuramente trasformare
piu' di un punto
ciao


caro gerry,
esiste un comando in VBA che data una matrice di trasformazione 4x4,
trasforma un oggetto dal suo UCS relativo secondo quella matrice.
quindi a me non resta altro che trovare la matrice di trasformazione
dall'UCS al WCS.
Siccome sapevo già quella dal WCS all'UCS mi bastava un'applicazione in VBA
che facesse
l'inversa di una matrice 4x4.
Ciao e grazie anche a te.
Pietro 1844.

Et voila'.
Ciao Giovanni A.
;---------------------------------------------------------------------------
--------------------------------------------------------
; Procedure sviluppate da Giovanni Anzani  -  
giova...@tiscalinet.it
; perfavore lasciate traccia di me come sviluppatore
; non mi assumo alcuna responsabilita' sul funzionamento di tali procedure
;---------------------------------------------------------------------------
--------------------------------------------------------
;---
(defun DEL-R (M r / #r Mb) (setq #r 0)
  (foreach ri M (if (/= #r r) (setq Mb (append Mb (list ri)))) (setq #r (1+
#r))) (setq Mb Mb))
;---
(defun DET4 (M /  r1  r2  r3  r4   a21 a22 a23 a24  a31 a32 a33 a34 a41 a42
a43 a44)
  (setq  r1 (nth 0 M)   r2 (nth 1 M)   r3 (nth 2 M)   r4 (nth 3 M))
  (setq a21 (nth 0 r2) a22 (nth 1 r2) a23 (nth 2 r2) a24 (nth 3 r2)
        a31 (nth 0 r3) a32 (nth 1 r3) a33 (nth 2 r3) a34 (nth 3 r3)
        a41 (nth 0 r4) a42 (nth 1 r4) a43 (nth 2 r4) a44 (nth 3 r4))
  (float (+ (*    (nth 0 r1) (+ (* a22 (- (* a33 a44) (* a34 a43)))  (* -1
a23 (- (* a32 a44) (* a34 a42)))  (* a24 (- (* a32 a43) (* a33 a42)))))
            (* -1 (nth 1 r1) (+ (* a21 (- (* a33 a44) (* a34 a43)))  (* -1
a23 (- (* a31 a44) (* a34 a41)))  (* a24 (- (* a31 a43) (* a33 a41)))))
            (*    (nth 2 r1) (+ (* a21 (- (* a32 a44) (* a34 a42)))  (* -1
a22 (- (* a31 a44) (* a34 a41)))  (* a24 (- (* a31 a42) (* a32 a41)))))
            (* -1 (nth 3 r1) (+ (* a21 (- (* a32 a43) (* a33 a42)))  (* -1
a22 (- (* a31 a43) (* a33 a41)))  (* a23 (- (* a31 a42) (* a32 a41))))))))
(defun DET<4 (M /  r1  r2  r3   a11 a12 a13   a21 a22 a23   a31 a32 a33)
(setq r1 (nth 0 M) r2 (nth 1 M) r3 (nth 2 M))
 (cond (r3  (setq a11 (nth 0 r1) a12 (nth 1 r1) a13 (nth 2 r1)
                  a21 (nth 0 r2) a22 (nth 1 r2) a23 (nth 2 r2)
                  a31 (nth 0 r3) a32 (nth 1 r3) a33 (nth 2 r3)))
       (r2  (setq a11 (nth 0 r1) a12 (nth 1 r1)
                  a21 (nth 0 r2) a22 (nth 1 r2)))
       (r1  (setq a11 (nth 0 r1))))
 (cond (r3  (float (+ (* a11 (- (* a22 a33)(* a23 a32))) (* -1 a12 (- (* a21
a33)(* a23 a31))) (* a13 (- (* a21 a32)(* a22 a31))))))
       (r2  (float (- (* a11 a22)(* a12 a21))))
       (r1  (float a11))))
;---
(defun INV4 (M / +1/de -1/de MT #ri #co Mtrt rii Mi)
  (setq +1/de (/ 1 (DET4 M))
 -1/de (- +1/de))
  (setq Mt (apply 'mapcar (cons 'list M)) #ri 0)
  (repeat 4  (setq Mtrt (apply 'mapcar (cons 'list (DEL-R Mt #ri))))
             (setq #co 0 rii nil)
             (repeat 4  (setq rii (append rii (list (* (if (= (rem (+ #ri
#co) 2) 0) +1/de -1/de) (DET<4 (DEL-R Mtrt #co))))))
                        (setq #co (1+ #co)))
             (setq #ri (1+ #ri))
             (setq Mi (append Mi (list rii)))))
;---