+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 5 su 5

Matrice inversa e prodotto

  1. #1
    stefano_te non è in linea Novello
    Ho cercato molto online ma non sono riuscito a trovare nulla che faccia al caso mio. Avrei bisogno di risolvere il seguente problema in VBA, ho excel 2010, la situazione di partenza è la seguente:
    nel foglio "cal1" ho la matrice A (quadrata) dalla cella B2 in poi
    nel foglio "cal2" ho il vettore V (vettore colonna) dalla cella B2 in giù
    le dimensioni di entrambi sono variabili, infatti cambiano al variare degli input nei fogli precedenti, quindi parlando in generale avrò una matrice quadrata (n righe x n colonne) e un vettore (1 colonna x n righe).
    Al momento le dimensioni possono andare da un minimo di A(1x1),V(1) ad un massimo di A(105x105),V(105); tuttavia appena ho finito vorrei aumentare le variabili e quindi andare anche oltre le 105 righe.
    Tramite vba vorrei ottenere:
    - nel foglio "cal3" la matrice B quadrata (n righe x n colonne) inversa della matrice A, dalla cella B2 in poi;
    - nel foglio "cal4" il prodotto tra la matrice B e il vettore V, (il risultato sarà un vettore colonna con n righe) dalla cella b2 in giù.

    Nelle celle oggetto del calcolo sono presenti valori numerici decimali positivi e negativi.

  2. #2
    Okay, ma tu quanto conosci di VBA e quanto codice vorresti ottenere dal forum?
    ℹ️ Leggi di più su AntonioG ...

  3. #3
    stefano_te non è in linea Novello
    Grazie per avermi risposto Antonio, stò imparando ad usare Vba da autodidatta, leggendo libri, provando e riprovando, da solo ho fatto diverse routine (non estremamente complesse), ma sicuramente non sono un esperto, soprattutto con le matrici.
    Per quanto riguarda la prima parte del mio problema (il calcolo dell'inversa) ho inserito la funzione MatriceInversa ma non so come avviarla correttamente all'interno del foglio:

    
    option base 1
    
    Private Sub MsgErrBox(ByVal Message As String)
        MsgBox Message, vbCritical, "Inversione matrici"
        End
    End Sub
    
    Private Function MatriceInversa(ByRef Matrice() As Double) As Double()
    Dim i As Integer, j As Integer, k As Integer
    Dim n As Integer
    Dim M() As Double, MInv() As Double
    Dim Temp As Double
        n = UBound(Matrice, 1)
        If UBound(Matrice, 2) <> n Then MsgErrBox "La matrice non e' quadrata!"
        ReDim M(n, 2 * n)
        For i = 1 To n
            For j = 1 To n
                M(i, j) = Matrice(i, j)
                M(i, j + n) = 1 - Sgn(Abs(i - j))
            Next
        Next
        For i = 1 To n
            j = i
            While M(j, i) = 0
                j = j + 1
                If j > n Then MsgErrBox "La matrice non e' invertibile!"
            Wend
            If i <> j Then
                For k = i To 2 * n
                    Temp = M(i, k)
                    M(i, k) = M(j, k)
                    M(j, k) = Temp
                Next
            End If
             If M(i, i) <> 1 Then
                Temp = M(i, i)
                For j = i To 2 * n
                    M(i, j) = M(i, j) / Temp
                Next
            End If
            For j = i + 1 To n
                If M(j, i) <> 0 Then
                    Temp = M(j, i)
                    For k = i To 2 * n
                        M(j, k) = M(j, k) - M(i, k) * Temp
                    Next
                End If
            Next
        Next
        For i = n To 2 Step -1
            For j = 1 To i - 1
                If M(j, i) <> 0 Then
                    Temp = M(j, i)
                    For k = i To 2 * n
                        M(j, k) = M(j, k) - M(i, k) * Temp
                    Next
                End If
            Next
        Next
        ReDim MInv(n, n)
        For i = 1 To n
            For j = 1 To n
                MInv(i, j) = M(i, j + n)
            Next
        Next
        MatriceInversa = MInv
    End Function
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim A()
    Dim B()
    B = MatriceInversa(A)
    debug.print B(i,j)
    End Sub
    
    Dovrebbe calcolare l'inversa ogni volta che i valori all'interno del foglio cambiano, le matrici A e B devono essere per forza dinamiche dato che le loro dimensioni variano; qui mi sono bloccato, come faccio a definire i valori di A? i valori di A sono contenuti nelle celle da B2 in poi.
    Ultima modifica di stefano_te; 16-04-2016 15:02 

  4. #4
    Ma dove sta il codice della funzione MatriceInversa?
    ℹ️ Leggi di più su AntonioG ...

  5. #5
    stefano_te non è in linea Novello
    Si hai ragione, ho aggiornato il primo post.

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Prodotto vettore per matrice
    Da suchigno nel forum Visual Basic .Net
    Risposte: 0
    Ultimo Post: 27-08-2009, 18:08
  2. Stampa Inversa elementi di un Array
    Da Vbnet nel forum Java
    Risposte: 2
    Ultimo Post: 26-01-2009, 09:57
  3. Relazione inversa
    Da cippalippa nel forum Visual Basic .Net
    Risposte: 2
    Ultimo Post: 27-06-2008, 12:53
  4. Trasformare una matrice di Boolean in matrice di Byte
    Da luciano.net nel forum Visual Basic 6
    Risposte: 5
    Ultimo Post: 15-06-2006, 17:20
  5. Risposte: 8
    Ultimo Post: 25-02-2005, 16:33