Somma di elementi consecutivi in una matrice matlab

di il
5 risposte

Somma di elementi consecutivi in una matrice matlab

Salve a tutti,
ho, in Matlab, una matrice 3D di coordinate (x,y,z). Devo calcolare le distanze tra i vari punti consecutivi e sommarle. Esempio se le x vanno da x1 a x10 vorrei:
distanza tra x1 e x2 + distanza tra x2 e x3 + ecc...

Come posso fare questo? Pensavo ad un ciclo for, ma ho dei dubbi su come impostarlo. Potreste aiutarmi? Sono principiante con matlab.
Grazie in anticipo

5 Risposte

  • Re: Somma di elementi consecutivi in una matrice matlab

    Per calcolare la differenza tra gli elementi consecutivi lungo le colonne puoi usare la funzione diff; non è chiaro, nella domanda se ti serve calcolare la differenza "con il segno" o no, nel caso, puoi usare la funzione diff devi poi considerarne il valore assoluto, usando la funzione abs
    Per poi calcolare la somma, sempre lungo le colonne, puoi usare la funzione sum.

    Fai riferimento alla documentazione on-line per i dettagli sulle funzoni.
    m=randi(33,10,3)
    % Calcolo della differenza tra gli elementi lungo le colonne
    differenze=abs(diff(m));
    % Calcolo della somma lungo le colonne
    somma=sum(differenze)
    
    Oppure,in una sola riga:
    differenze=sum(abs(diff(m));)
    
    Input:
    m =
       16   30   32
        4   29   16
       16   13   11
        5   18   24
       23   19   29
       24    5   20
        5   26    5
       33   19   14
        9    2   22
        3    3   33
    
    Output:
    differenze =
       12    1   16
       12   16    5
       11    5   13
       18    1    5
        1   14    9
       19   21   15
       28    7    9
       24   17    8
        6    1   11
    
    somma =
       131    83    91
    
  • Re: Somma di elementi consecutivi in una matrice matlab

    Ciao grazie per la risposta, io però non intendevo differenza ma distanza tra due punti. Ho infatti coordinate di un tot punti (x,y e z) e devo calcolare la distanza tra punti consecutivi. Per questo parlavo di ciclo for
  • Re: Somma di elementi consecutivi in una matrice matlab

    Nella prima domanda hai scritto:
    Esempio se le x vanno da x1 a x10 vorrei: distanza tra x1 e x2 + distanza tra x2 e x3 + ecc...
    ed il codice proposto, quello calcola.

    Se invece vuoi calcolare la distanza euclidea, come somma delle distanze euclidee tra due serie consecutive di punti, puoi provare con:
    
    distanza=sum(sqrt(sum((diff(m).^2),2)))
    
  • Re: Somma di elementi consecutivi in una matrice matlab

    Si esatto intendevo la distanza euclidea:
    distanza=sum(sqrt(sum((diff(m).^2),2)))

    la matrice m :
    m =
    16 30 32
    4 29 16
    16 13 11
    5 18 24
    23 19 29
    24 5 20
    5 26 5
    33 19 14
    9 2 22
    3 3 33

    contiene le coordinate dei punti che mi interessano: quindi prima riga corrisponde al primo punto P1 , seconda riga al secondo punto P2 e così via.
    io dovrei calcolare le distanze tra i vari punti e sommarle : dist(P1/P2)+dist(P2/P3) + ecc...
    mi serve quindi un ciclo for, potrebbe andare una cosa del genere?
    somma = 0;
    for i=1:length(m)
    somma = somma + sqrt(sum((m(i+1,:) - m(i,:)).^2),2));
    end
  • Re: Somma di elementi consecutivi in una matrice matlab

    Con riferimento a quanto hai scritto:
    [ ... ]mi serve quindi un ciclo for [ ... ]
    Perchè?
    Hai visto e provato il codice al fondo della risposta precedente?
    Si può ottenere lo stesso risultato sfruttando la proprietà di indexing di MatLab con una sola linea di codice: distanza=sum(sqrt(sum((diff(m).^2),2)))

    [ ...] potrebbe andare una cosa del genere? [ ...]
    Hai provato ad eseguire il codice che hai scritto?

    Il codice contiene due errori, se lo avessi eseguito avresti dovuto ricevere dei messaggi di errore:
    1) Il ciclo for non può essere essere esteso fino a length(m) perchè, nell'ultima iterazione, con m(i+1,:) accederesti alla riga m+1 della matrice mentre questa ha "solo" m righe
    Il loop deve terminare a length(m);

    2) nell'istruzione somma = somma + sqrt(sum((m(i+1,:) - m(i,:)).^2),2)); non deve esserci una parentesi chiusa dopo .^2
Devi accedere o registrarti per scrivere nel forum
5 risposte