Verificare se una matrice è sottomatrice di un'altra

di il
2 risposte

Verificare se una matrice è sottomatrice di un'altra

Ciao a tutti. Devo scrivere in matlab un codice che, date in input due matrici quadrate A di ordine m, B di ordine n, con n<m, restituisca in output una variabile h=1 se B è sottomatrice di A, h=0 se non lo è.
Quello che avevo pensato di fare è estrarre da A tutte le sottomatrici di ordine n e confrontarle con B, ma non saprei come scriverlo in matlab e inoltre penso che il processo sarebbe molto lungo. Come potrei procedere?
Grazie

2 Risposte

  • Re: Verificare se una matrice è sottomatrice di un'altra

    Partendo dalle due matrici A e B, un possibile approccio potrebbe essere:

    [*] cercare le occorrenze del primo elemento della matrice B in A (con la funzione "find" che ritorna gli indici riga e colonna delle occorrenze)
    [*] per ognuna delle occorrenze, verificare se l'elemento a "destra" (stessa riga, colonna successiva) dell'elemento trovato sia uguale al corrispondente elemento della matrice B
    [*] in caso positivo, c'è a possibilità di aver individuato una occorrenza d B in A
    [*] per verificarlo, estraiamo da A una sotto-matrice della dimensione di B, partendo dalla posizione del primo elemento trovato
    [*] sottraiamo questa sotto-matrice alla matrice B
    [*] se la matrice risultato contiene solo "0" abbiamo trovato un'occorrenza di B in A
    
    % Define the "Big" matrix
    A=[   13   25   19   10   26   15   29   18    1   17
       33   28   20   14   19   18    5   19    6    5
       10    2   11   32   28   10   27   17    6   30
       31   11   32    8   24   14   23   23    6    7
       33   20    7   15   10   21    6   21   21   15
       18    5    7   10   11   32   20   28   28   14
       29    9   31   16   20    7   11   27    8   20
        8    4   32   10   21   19   29   31   27    6
       25   14   21   32    5   10    5   29   13   32
        3   29   23   24   24   15    7   15    9    1];
    % Define the "Small" matrix
    B=[11 32
       20  7];
    % Get the size of the Small matrix
    sa=size(B,2);
    % Get the first element of the Small matrix (just not to use x(1,1)
    b11=B(1,1);
    % Get the second element of the Small matrix (just not to use x(1,2)
    b12=B(1,2);
    % Find the locatino of the first element of the Small matrix in the Big matrix
    [r,c]=find(A(1:end-sa+1,1:end-sa+1) == b11);
    % Get the number of occurrence of the first element of the Small matrix in the Big matrix
    n_f=length(r);
    % Initialize the counter of the Small matrices found
    found_cnt=0;
    % Initialize the matrix to hold the output
    output_data=[];
    % Loop over the found occurrence
    for i=1:n_f
       % If the element next (on the same row) to the found element is equal to the
       % second element of the Small matrix, the Small matrix could be there
       if(A(r(i),c(i)+1) == b12)
          % Get a sub-matrix of the Big matrix of the size of the Sall matrix
          % and subtract the Small matrix from the extracted sub-matrix
          tmp=A(r(i):r(i)+sa-1,c(i):c(i)+sa-1)-B
          % If the resultis a matrix of "0" the Small matrix has been found in the
          % Big matrix then increment the counter and store the row, column indices
          % and the flag
          if(~any(tmp(:)))
             found_cnt=found_cnt+1;
             output_data(found_cnt,:)=[r(i) c(i)]
          end
       end
    end
    
    Nel caso le matrici A e B abbiano valori "reali" e non interi, la differenza tra le matrici deve essere confrontata non con "0", ma con un valore di soglia opportunamente piccolo (es. 1.0e-5)
  • Re: Verificare se una matrice è sottomatrice di un'altra

    Grazie infinite!
Devi accedere o registrarti per scrivere nel forum
2 risposte