[MatLab] Vettore Media

di il
2 risposte

[MatLab] Vettore Media

Salve a tutti, premetto che non sono un esperto di matlab, ho cominciato ad usarlo da una settimana circa da autodidatta . Ho un vettore colonna A (1;130100), e da questo vorrei ottenere un secondo vettore colonna B (1,1301) la cui prima componente è la media delle prime 100 componenti di A, la seconda componente è la media delle componenti 100-200 di A, e via discorrendo. Ho provato a creare un ciclo for che facesse questa operazione, ma come già vi ho detto, sono molto inesperto, e ovviamente il ciclo mi restituisce tutt'altro.
vector = [1:130100]';

for i=1:1300
    for j=0:100
        sum = vector (j+100*i);
    end
    med(i)=sum/100;
end

media = med';
Credo che la soluzione per molti di voi sia banale, mi sapreste aiutare? Grazie.

2 Risposte

  • Re: [MatLab] Vettore Media

    Ci sono molti modi per effettuare il calcolo delle medie.
    Ecco alcuni esempi:

    Con due cicli for annidati (come nel codice che hai pubblicato)
    Il codice che hai pubblicato, contiene alcuni errori; la versione corretta è:
    
    for i=1:130100/100
       s=0;
       for j=1:100
          s=s+vector(j+(i-1)*100);
       end
       vector_media_1(i)=s/100;
    end
    
    Con un solo ciclo for
    In questo caso, il secondo ciclo "for" è sostituito da un vettore di indici (idx)

    Il vettore idx contiene i valori: 1, 101, 201, 301, ... ecc.
    Questi vengono usati nel ciclo "for" per identificare i "sotto-vettori" dei quali calcolare la media (prova a vedere come funzione con il debug)
    
    idx=1:100:130100;
    for i=1:length(idx)-1
       vector_media_2(i)=mean(vector(idx(i):idx(i+1)-1));
    end
    vector_media_2(end+1)=mean(vector(idx(i+1):end));
    
    Senza cicli "for", con una sola istruzione!!!
    Questa è una "bella" soluzione:
    la funzione "reshape":
    help reshape
    reshape Reshape array.
    reshape(X,M,N) returns the M-by-N matrix whose elements
    are taken columnwise from X. An error results if X does
    not have M*N elements.
    In pratica, nel caso specifico, crea una matrice (100 x 1301) "riorganzzando" i valori del vettore "vector".
    Di questa matrice viene quindi calcolata la media, colonna per colonna (vedi l'help di MatLab per i detagli su come opera la funzione "mean")
    
    vector_media_3=mean(reshape(vector,100,1301));
    
    Sfruttando il fatto che, nel caso specifico le varie medie differiscono di 100 una dall'altra
    
    media_1_100=mean(1:100);
    idx=[0:100:130100];
    vector_media_4=media_1_100+idx(1:end-1);
    
    Un suggerimento importante:
    nell'istruzione:

    sum = vector (j+100*i);

    hai usato "sum" some variabile (immagino volessi che "sum" fosse la somma degli elementi del vettore "vector" all'interno del ciclo for.

    Tieni presente che in MatLab esiste la funzione "sum" che "somma" gli elementi del vettore o matrice che riceve in input (vedi l'help di MatLab per il dettagli).
    Purtroppo, MatLab consente di assegnare ad una variabile il nome di una funzione (tralasciamo per il momento gli "function's handle), tuttavia, dal momento in cui si chiama una variabile col nome di una funzione, quest'ultima non è più riconosciuta come tale.

    Bisogna quindi evitare di definire delle variabili in questo modo.

    Nel dubbio che il nome che si vuole dare ad una variabile possa essere quello di una funzione di MatLab, puoi usare il comando "which" (dalla Command Window).

    Hope this helps.
  • Re: [MatLab] Vettore Media

    Grazie, Grazie e Grazie! Sei stato chiarissimo e gentilissimo. In questi giorni proverò tutte le tue proposte, anche se credo che la prima, per il mio livello , basta ed avanza.
Devi accedere o registrarti per scrivere nel forum
2 risposte