Problema con le matrici

di il
20 risposte

Problema con le matrici

Ho un problema complicatissimo con le matrici che vi espongo brevemente. Si dovrebbe risolvere con qualche ciclo.

Ho una matrice di questo tipo:

M = [
68 876 7
87 678 9
68 876 6
68 876 9
23 123 4
87 678 11
3 65 109];

che vorrei trasformare in questa:

M2 = [
87 678 9
68 876 6
23 123 4
3 65 109];

In pratica vorrei eliminare le righe che hanno il primo ed il secondo termine uguale conservando solo quella con il terzo valore restante inferiore.

C'é qualche comando che mi potrebbe tornare utile?

Dopo aver fatto questo vorrei ordinare la stessa in questo modo:

M3 = [
23 123 4
68 876 6
87 678 9
3 65 109];

In modo che il terzo valore sia continuamente crescente.

Ciao e grazie come sempre

20 Risposte

  • Re: Problema con le matrici

    Non è poi così difficile, penso ci siano tanti modi per risolvere il problema, dipende un pò dalla propria fantasia.
    A me viene in mente questo, che evita anche di fare il ciclo.
    sottrai alla matrice una versione della stessa scalata di una riga, (in modo che la seconda riga sia sottratta dalla prima, e così via:
    M = [
    68 876 7
    87 678 9
    68 876 6
    68 876 9
    23 123 4
    87 678 11];
    M1 = [
    87 678 9
    68 876 6
    68 876 9
    23 123 4
    87 678 11
    3 65 109];
    Ho tolto ad M l'ultima riga perchè per poterle sottrarre devono avere lo stesso numero di righe.
    Quindi fai S=M-M1
    A questo punto, al posto delle righe uguali avrai degli zeri.
    Usi la funzione find(S(:,1)) per trovare gli zeri nella prima colonna.
    Le posizioni in uscita dalla funzione find sono le righe che devi eliminare.
    Non so se il ragionamento è comprensibile. Ma è più facile farlo che spiegarlo.
  • Re: Problema con le matrici

    Facile!?!?!
  • Re: Problema con le matrici

    Sono diversi passaggi ma abbastanza semplici.
    Prova a seguirli passo passo. (prima magari cerca di capire il meccanismo, chiedi pure se qualcosa non è chiaro)
  • Re: Problema con le matrici

    Per fare la sottrazione puoi usare direttamente la funzione diff, così:
    A = [2 3 1;1 2 3;6 5 1]
    diff(A)

    Quando ci sono delle righe uguali troverai degli zeri...
  • Re: Problema con le matrici

    Ho fatto i cicli for e dovrei eserci riuscito ma ho ancora un problema perché la matrice di output ha delle righe che si ripetono...

    come posso eliminare le righe che si ripetono possibilmente partendo dalle righe pù basse?

    non posso usare diff perché cambia completamente la matrice!

    non sto studiando un sistema di equazioni!
  • Re: Problema con le matrici

    Evidentemente non hai capito cosa intendevo dire.
    Ovviamente, dato che le righe uguali a coppie sono diverse, sei costretto a fare il ciclo for per controllarle tutte.
    Ti stavo spiegando semplicemente un metodo più furbo, che non ha niente a che fare con i sistemi di equazioni (che c'entra?). Faccio l'esempio con un vettore:
    a= [1 2 3 3 4 5 5 6];
    se fai diff(a) ti esce questo
    1 1 0 1 1 0 1
    e guarda dove capitano gli zeri... proprio sugli elementi del vettore da cancellare!
    e dato che la funzione find ti permette di trovare le posizioni di questi valori (in questo caso ti direbbe (3,6), con 3 righe e senza cicli for hai risolto il problema.
    Comunque, fai pure il ciclo che probabilmente è più immediato.
    Se vuoi partire dal basso fai il ciclo al contrario, a passi di -1
    for i=101
    Per cancellare le righe devi assegnarle ad un vettore vuoto, cioè riga=[]; elimina la riga dalla matrice.
  • Re: Problema con le matrici

    Il comando di cui mi parli non funziona con le matrici rettangolari
  • Re: Problema con le matrici

    Io ho una matrica di questo tipo:

    a=[
    1 2 3
    4 6 7
    59 1 1
    1 2 3];

    che voglio trasformare in questa:

    a=[
    1 2 3
    4 6 7
    59 1 1];

  • Re: Problema con le matrici

    Funzionano tutti anche con le matrici rettangolari, a quale comando ti riferisci?
  • Re: Problema con le matrici

    A diff! guarda qui:

    a=[
    1 2 3
    4 6 7
    59 1 1
    1 2 3];
    >> diff(a)
    ans =
    3 4 4
    55 -5 -6
    -58 1 2

    ??? cosa posso fare? sto impazzendo sempre che non lo sia già...
  • Re: Problema con le matrici

    Ok, in realtà funziona.
    Solo che la matrice non è ordinata, cioè le righe uguali non sono consecutive (nel primo esempio mi sembravano consecutive, non avevo notato che una non era consecutiva).
    Quindi bisogna prima ordinarla, con sortrows.
    Coraggio.
  • Re: Problema con le matrici

    Non ti seguo ma domani mi ci ributto sopra...

    Per ora grazie di tutto
  • Re: Problema con le matrici

    Volevo ancora chiederti una cosa. Esiste un comando che mi permette di verificare che 2 vettori siano esattamente identici? Ho notato che il semplice doppio uguale (==) non funziona!
  • Re: Problema con le matrici

    Certo che funziona...
    [1 2 3]== [1 2 4]
    ans =
    1 1 0
    ti dice ciascun elemento se è uguale (1) o diverso (0). Se vuoi sapere se sono tutti uguali basta fare la somma del risultato. Se è zero vuol dire che i due vettori sono uguali. (Lo stesso che se fai la differenza tra i due vettori... se sommando gli elementi del vettore differenza viene zero, vuol dire che i due vettori sono uguali.
    Altrimenti usi isequal che ti dà direttamente 1 se sono uguali o 0 se sono diversi.
Devi accedere o registrarti per scrivere nel forum
20 risposte