Problema con le matrici

di il
20 risposte

20 Risposte - Pagina 2

  • Re: Problema con le matrici

    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..
  • Re: Problema con le matrici

    Beh sì... perché così cambia rP nel ciclo interno mentre rimane quello iniziale nel ciclo esterno.
  • Re: Problema con le matrici

    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!
  • Re: Problema con le matrici

    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),:)=[];
  • Re: Problema con le matrici

    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...
  • Re: Problema con le matrici

    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