Estrarre una sotto matrice in MATLAB

di il
1 risposte

Estrarre una sotto matrice in MATLAB

Gentili utenti,

ho un disperato bisogno di un vostro aiuto. Sto per affrontare l'esame di Metodi Numerici per l'ingegneria civile e mi è stato assegnato un progetto da svolgere in Matlab. Non riesco però a compilare una parte di uno script per far eseguire un'operazione apparentemente semplice. Vi spiego dettagliatamente.

Ad un certo punto dello script, mi viene restituita una matrice A quadrata nxn e un vettore colonna F nx1.

Il vettore colonna è caratterizzato da elementi non nulli e nulli.

Dalla matrice A devo "eliminare" le righe e le colonne corrispondenti ai valori nulli di F e creare una nuova matrice quadra B (più piccola ovviamente) in cui gli elementi sono quelli "sopravvissuti" alla cancellazione di righe e colonne della matrice A.

Per farvi capire visivamente quello che voglio fare, guardate l'immagine che ho allegato. A titolo di esempio ho una matrice 6x6 e un vettore colonna F i cui elementi nelle righe 3, 5 e 6 sono non nulli mentre 1,2 e 4 sono nulli. Quindi elimino dalla matrice 6x6 le righe 1, 2, e 4 e le colonne 1, 2 e 4. Ottenendo dunque una sottomatrice 3x3.

Vorrei che lo script fosse automatico per qualsiasi valore della dimensione n di matrice A e vettore F. Spero davvero che qualcuno possa aiutarmi grazie mille
Allegati:
17701_ebee7b4f8bda2d5651e67258389996d1.jpg
17701_ebee7b4f8bda2d5651e67258389996d1.jpg

1 Risposte

  • Re: Estrarre una sotto matrice in MATLAB

    Per cancellare le righe e le colonne puoi procedere in questo modo:

    [*] identificare i valori "0" nel vettore F:
    si può usare la funzione "find" che ritorna (nel caso di un vettore) la posizione (l'indice) nella quale si trova l'elemento cercato:

    idx=find(F == 0)

    [*] fare una copia della matrice A (se non la si vuole modificare)

    B=A;

    [*] cancellare le righe identificare dalla serie di indici memorizzati in "idx"

    B(idx,:)=[];


    [*] cancellare le colonne identificare dalla serie di indici memorizzati in "idx"

    B(:,idx)=[];
    
    % Definizione del numero di righe e colonne
    n=6
    % Generazione di una matrice di esempio
    A=randi(13,n,n)
    % Generazione del vettore F (randper serve solo per "mischiare" gli "0" e
    % gli "1"
    F=[1 1 1 0 0 0]
    F=F(randperm(n))
    % Identificazione degli "0" nel vettore F
    idx=find(F == 0)
    % Copia della matrice originale
    B=A;
    % Cancellazione delle righe
    B(idx,:)=[];
    % Cancellazione delle colonne
    B(:,idx)=[]
    
    
    A =
    
         6     6    13     5     6    10
        11     9     3    13     8     9
        11     9     2    12    13     8
         1     4     5     1     6    10
         6     6     3    10    13     9
         7     1     7     4     4     3
    
    
    F =
    
         1     1     1     0     0     0
    
    
    F =
    
         0     1     1     0     0     1
    
    
    idx =
    
         1     4     5
    
    
    B =
    
         9     3     9
         9     2     8
         1     7     3
    
    
    
    Hope this helps.
Devi accedere o registrarti per scrivere nel forum
1 risposte