Problema con le matrici

di Anonimizzato9243 il
20 risposte

20 Risposte - Pagina 2

  • Questo é il codice che non mi funziona
    [rP,cP]=size(P);
    k=1;
    for q=1:rP
        for m=1:rP
            if m~=q & P(q,1)==P(m,1) & P(q,2)==P(m,2) & P(q,3)==P(m,3) & P(q,4)==P(m,4)
                P(q,:)=[];
            end
        end
        [rP,cP]=size(P);
    end
    e l'errore é queto:
    ??? Index exceeds matrix dimensions.

    Error in ==> preziario_tegoli at 60
    if m~=q & TTnew(q,1)==TTnew(m,1) & TTnew(q,2)==TTnew(m,2) &
    TTnew(q,3)==TTnew(m,3) & TTnew(q,4)==TTnew(m,4)
    credo che l'eliminazione della riga comprometta la funzionalità del ciclo for..
  • Beh sì... perché così cambia rP nel ciclo interno mentre rimane quello iniziale nel ciclo esterno.
  • EVVVAIII!!! GRAZIE MILLE!!!

    Sono appena riuscito a creare una funzione che elimina le righe uguali di una matrice. L'unico problema é la pesantezza eccessiva del codice che dovendo iterare parecchio succhia molte risorse. Pazienza, per ora mi accontento.

    PROBLEMA RISOLTO!
  • Visto che ci sei riuscito, ti propongo anche questo. Senza cicli.
    [b index]=sortrows(a);
    c=diff(b);
    b(find(sum(c(:,1:2),2)==0)+1,:)=0;
    d(index,:)=b;
    d(find(sum(d(:,1:2),2)==0),:)=[];
  • Sulle mie matrici 300x4 non funziona. Ho provato a scriverlo così:
    [b index]=sortrows(a);
    c=diff(b);
    b(find(sum(c(:,1:4),2)==0)+1,:)=0;
    d(index,:)=b;
    d(find(sum(d(:,1:4),2)==0),:)=[];
    ma non c'é stato verso.

    Mi cancella delle righe di troppo però é molto più veloce del mio come codice.
    Continuo a non capire ESATTAMENTE la logica di diff().

    Funziona su matrici piccole ma non su matrici grandi...
  • Lo avevo scritto per le matrici che avevi portato come esempio in cui dovevi eliminare le righe con le prime due colonne uguali.
    Ovviamente se le matrici sono diverse (4 colonne e devi confrontare le prime 2? le prime 3?) anche il codice sarà diverso.
    Ovviamente è più veloce, perché il doppio ciclo for deve controllare 300*300 combinazioni, che sono tante (non ricordo se nel ciclo escludevi le righe già controllate).
    Fino a lunedì non avrò matlab a disposizione quindi lunedì controllerò il codice che hai modificato per adattarlo alle nuove matrici.
    La funzione diff fa semplicemente una differenza, non c'è molto da spiegare. All'interno di una matrice sottrae l'i-esima riga alla i+1-esima.
    Se le due righe sono uguali dà tutti zeri. Ovviamente le righe uguali devono essere consecutive altrimenti non funziona. Per questo bisogna fare prima l'ordinamento.
    Non so se poi i valori ti servono nello stesso ordine della matrice di partenza, ho immaginato di sì, quindi ho fatto restituire anche alla funzione sort anche un indice, per fargli ricordare come erano messe in partenza le righe.
Devi accedere o registrarti per scrivere nel forum
20 risposte