moltiplicare matrice trasposta per matrice



  • 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