moltiplicare matrice trasposta per matrice
Hai un problema con Excel? 
moltiplicare matrice trasposta per matrice ..
di Rik (utente non iscritto) data: 24/06/2013 19:28:26
Salve, sono un neofita di vba e devo realizzare una macro che mi permetta di moltiplicare una matrice Xtrasposta per X...le righe vengono aggiunte e quindi (penso) deve comprendere anche un ciclo for..next.....come posso fare? grazie 1000!!
di Vecchio Frac data: 24/06/2013 20:21:57
Un esempietto?
esempio moltiplicazion
di Rik (utente non iscritto) data: 25/06/2013 05:17:47
dunque...supponiamo che ho una tabellina di dati di 5 righe e 3 colonne. A partire da questa, devo eseguire una serie di operazioni:
1.fare la trasposta della matrice (ribalto la matrice e ne ottengo una di 3 righe e 5 colonne). La nuova tabella, per semplicità, la chiamo W
2.il risultato, (W), moltiplicarlo per la matrice per la matrice originaria (in questo modo ottengo una nuova matrice di 3 righe e 3 colonne). Ottengo una nuova tabella (matrice) che chiamo Z
3.Faccio l'inversa di Z e ottengo H
4. Devo moltiplicare H per W
Cosa importante è che la tabellina, può aumentare le righe..di consueguenza ogni volta che premo il pulsante, i calcoli devono aggiornarsi contemplando anche la nuova righa
Vorrei fare il tutto con vba..non dovrebbe essere difficile dal momento che excel già possiede le funzioni di matr.trasposta, matr.prodotto e matr.inversa...spero di poter ringraziare qualcuno!
di Vecchio Frac data: 25/06/2013 10:01:18
Direi che è chiaro...
i dati sono numerici ovviamente. Mi invento uno scenario arbitrario? o ci sono vincoli sul numero di righe e colonne (5 e 3) delle tabelle coinvolte?
nessun vincolo
di rik (utente non iscritto) data: 25/06/2013 10:09:11
Ciao, nessun vincolo..sono tutti numeri e sia le righe e le colonne potrebbero incrementare...inoltre, i dati si trovano in un foglio diverso da dove è situato il bottone..grazie!
di Vecchio Frac data: 25/06/2013 11:30:10
Qualcosa mi sfugge.
cit. "2.il risultato, (W), moltiplicarlo per la matrice originaria (in questo modo ottengo una nuova matrice di 3 righe e 3 colonne)."
---> ottengo una nuova matrice di 5x5.
Mi manca la teoria delle matrici.
Probabilmente devo prima documentarmi.
di Vecchio Frac data: 25/06/2013 11:52:38
Allego un semplice file di esempio, con alcune prove effettuate, per tua verifica.
Non ho usato alcun codice, ma solo formule immesse in forma di matrice (con ctrl-maiusc-invio).
Giusto per capire :)
risultato
di rik (utente non iscritto) data: 25/06/2013 12:00:28
..ciao..faccio un esempio
data la matrice che chiamo A (che posiziono da a1 a c5)
3; 1: 2
2; 7; 8
1; 5; 5
5; 3; 5
5; 2; 4
se eseguo il comando =matr.trasposta(a1:c5) ottengo una nuova tabella (dopo che ho cliccato ctr-alt-invio) che chiamo W
3; 2; 1; 5; 5
1 ; 7; 5; 3; 2
2 ;8; 5; 5; 4
Questa W si trova da f2 a j4. Ora se faccio WxA (e non AxW) con il comando = matr.prodotto(f2:j4;a1:c5) ottengo la mia matrice Z
64; 47; 72
47; 88; 106
72; 106; 134
ora faccio =matr.inversa( Z) e ottengo H
0,700251889; 1,680100756; -1,705289673
1,680100756 ;4,272040302; -4,282115869
Se moltiplico H per W (=matr.prodotto(H;W))
ottengo
0,370277078 ;-0,481108312; 0,574307305; 0,01511335 ; 0,040302267;
0,748110831; -0,992443325; 1,629722922; -0,19395466; -0,183879093
A parte che la matrice originaria A può avere le righe che si incrementano (e che comunque è posizionata in un foglio diverso da dove devo mettere il pulsante), ti chiedo, inoltre, se è possibile (e come) specificare tutto in una routine...o devo dichiarare delle aree di un foglio (magari di un foglio nascosto dove eseguire i calcoli)...
Ovviamente, come avrai capito, la funzione o routine che devo costruire non si ferma qui...questi sono solo i primi passaggi...
Grazie e scusa delle imperfezioni del linguaggio
matr_trasposta
di rik (utente non iscritto) data: 26/06/2013 11:08:40
salve, sono riuscito a creare una matrice trasposta...ma adesso se la volessi moltiplicare per quella di partenza (matr.prodotto(matrice1;matrice2)) e fare in modo che il tutto venga eseguito al click del mouse?
scusatemi ma sono davvero alle prime armi e spero di ricevere qualche aiuto
Sub Trasposta()
Dim sourceRange As Range
finale = Range("A65536").End(xlUp).Row
Set sourceRange = ActiveSheet.Range(Cells(6, 1), Cells(finale, 2))
Set A = ActiveWorkbook.Worksheets("calcoli").Cells(10, 5)
sourceRange.Copy
A.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
End Sub |
di HarryBosch data: 28/06/2013 01:16:38
Quanti ricordi le matrici! La nostra Prof ci faceva impazzire.. (nota che sono passati un bel pò d'anni ^_^).
Comunque mi sono divertito a recuperare ricordi piacevoli e ti ho preparato un file che dovrebbe fare al caso tuo..
Anche se non ho gestito gli errori derivanti da possibili matrici inesistenti o non calcolabili. Magari questo lo vediamo la prossima volta.
Nota che la matrice di origine va scritta a partire dalla cella A1 del foglio "Matrici" o di un qualsiasi foglio vuoto. Premi CTRL + t per avviare la macro.
Ammetto che il codice che ho preparato non è semplicissimo da capire; se sei alle prime armi troverai qualche difficoltà nella lettura (se ritieni interessante approfondire vedo di aggiungere i commenti al codice).
Comunque sfrutta esattamente le funzioni del foglio, che vengono richiamate con WorksheetFunction.
Riporto qua sotto la parte che determina tutte le matrici, per chi fosse interessato e non trovasse il file da scaricare.
Sub trasposta()
Dim matr_A As Range, matr_W As Range, matr_Z As Range, matr_H As Range, matr_X As Range
Dim rig As Integer, col As Integer
Dim rif_W As Integer, rif_H As Integer
Application.ScreenUpdating = False
If [a1] = "" Then
MsgBox "Inserisci la tua matrice a partire dalla cella A1"
Exit Sub
End If
Set matr_A = [a1].CurrentRegion
rig = matr_A.Rows.Count
col = matr_A.Columns.Count
matr_A.Interior.ColorIndex = 6
Set matr_W = matr_A.Offset(rig + 1).Resize(col, rig)
matr_W = WorksheetFunction.Transpose(matr_A)
matr_W.Interior.ColorIndex = 43
Set matr_Z = matr_W.Offset(matr_W.Rows.Count + 1).Resize(rig)
matr_Z = WorksheetFunction.MMult(matr_A, matr_W)
matr_Z.Interior.ColorIndex = 20
Set matr_H = matr_Z.Offset(matr_Z.Rows.Count + 1)
matr_H = WorksheetFunction.MInverse(matr_Z)
matr_H.Interior.ColorIndex = 44
Set matr_X = matr_H.Offset(rig + 1).Resize(col, rig)
rif_W = matr_X.Row - matr_W.Row
rif_H = matr_X.Row - matr_H.Row
matr_X.FormulaArray = _
"=R[-" & rif_W & "]C:R[-" & rif_W - col + 1 & "]C[" & rig - 1 & "]*R[-" & rif_H & "]C:R[-2]C[" & rig - 1 & "]"
matr_X.Interior.ColorIndex = 42
Columns.AutoFit
[a1].Select
Application.ScreenUpdating = True
end sub |
Vuoi Approfondire?