Inversa di una matrice triangolare
Ciao a tutti, sto cercando di modificare i miei codici (per calcolare l'inversa di una matrice generica) per trattare il caso particolare di una matrice triangolare, nel mio caso alta, ma fa lo stesso.
Allora (la parte di) il codice di cui parlo è
Tuttavia, visto che l'inversa di una matrice triang sup è una matrice triang sup, ho come l'impressione che tutti quei cicli for da 0 a n siano diciamo superflui, e debba quindi modificarli per non richiedere al calcolatore più del dovuto.
Che ne dite?
Allora (la parte di) il codice di cui parlo è
{for(k=0;k<n;k++) {for(j=0;j<n;j++) e[j]=I[k][j]; /* e è il jesimo versore della base canonica*/ /*Poichè A è triang sup, non ho bisogno di usare forward.c */ backsub(A, e, n, x); /*La soluzione x di tale sistema è la jesima colonna della matrice inversa di A */ {for(j=0;j<n;j++) if(j==k) {for(i=0;i<n;i++) for(j=0;j<n;j++) if(j==k) B[i][k]=x[i]; }; }; }; };
Tuttavia, visto che l'inversa di una matrice triang sup è una matrice triang sup, ho come l'impressione che tutti quei cicli for da 0 a n siano diciamo superflui, e debba quindi modificarli per non richiedere al calcolatore più del dovuto.
Che ne dite?
Risposte
up
Tu hai che \(\displaystyle AX = I \) che può essere scritto come:
\(\displaystyle \begin{pmatrix} \mathbf{r}^A_1 \\ \vdots \\ \mathbf{r}^A_n \end{pmatrix} \begin{pmatrix} \mathbf{c}^X_1 & \cdots & \mathbf{c}^X_n \end{pmatrix} = \begin{pmatrix} \mathbf{c}^I_1 & \cdots & \mathbf{c}^I_n \end{pmatrix} \)
Dove \(\displaystyle \mathbf{r} \) e \(\displaystyle \mathbf{c} \) si riveriscono alle righe e alle colonne rispettivamente, il loro apice è la matrice e il loro pedice è il numero.
Nota che \(\displaystyle \begin{pmatrix} \mathbf{r}^A_1 \\ \vdots \\ \mathbf{r}^A_n \end{pmatrix} \mathbf{c}^X_i = \mathbf{c}^I_i \) ovvero \(\displaystyle A \mathbf{c}^X_i = \mathbf{c}^I_i \) che è sostanzialmente quello che stavi facendo tu risolvendo quel sistema triangolare. Anche se non capisco tutto il tuo codice.
Quindi devi di fatto fare un ciclo di lunghezza \(\displaystyle n \) in cui fai \(\displaystyle \mathbf{c}^X_i = A \setminus \mathbf{c}^I_i \) (usando la notazione di MATLAB).
In realtà, per come hai definito la matrice, ti converrebbe lavorare per righe. Farlo non è difficile ma dovresti fare una nuova versione di backsub se risolve equazioni matriciali del tipo \(\displaystyle AX = B \) come \(\displaystyle A \) triangolare superiore. Di fatto è uguale ma fai operazioni sulle righe invece che su elementi.
\(\displaystyle \begin{pmatrix} \mathbf{r}^A_1 \\ \vdots \\ \mathbf{r}^A_n \end{pmatrix} \begin{pmatrix} \mathbf{c}^X_1 & \cdots & \mathbf{c}^X_n \end{pmatrix} = \begin{pmatrix} \mathbf{c}^I_1 & \cdots & \mathbf{c}^I_n \end{pmatrix} \)
Dove \(\displaystyle \mathbf{r} \) e \(\displaystyle \mathbf{c} \) si riveriscono alle righe e alle colonne rispettivamente, il loro apice è la matrice e il loro pedice è il numero.
Nota che \(\displaystyle \begin{pmatrix} \mathbf{r}^A_1 \\ \vdots \\ \mathbf{r}^A_n \end{pmatrix} \mathbf{c}^X_i = \mathbf{c}^I_i \) ovvero \(\displaystyle A \mathbf{c}^X_i = \mathbf{c}^I_i \) che è sostanzialmente quello che stavi facendo tu risolvendo quel sistema triangolare. Anche se non capisco tutto il tuo codice.
Quindi devi di fatto fare un ciclo di lunghezza \(\displaystyle n \) in cui fai \(\displaystyle \mathbf{c}^X_i = A \setminus \mathbf{c}^I_i \) (usando la notazione di MATLAB).
In realtà, per come hai definito la matrice, ti converrebbe lavorare per righe. Farlo non è difficile ma dovresti fare una nuova versione di backsub se risolve equazioni matriciali del tipo \(\displaystyle AX = B \) come \(\displaystyle A \) triangolare superiore. Di fatto è uguale ma fai operazioni sulle righe invece che su elementi.