Creare tanti vettori quante sono le colonne della matrice

di il
13 risposte

Creare tanti vettori quante sono le colonne della matrice

Salve a tutti, esiste un modo per creare tanti vettori quante sono le colonne di una matrice?
Ad esempio, io ho la matrice "mat" di 50 colonne. Attraverso il comando A=mat(:, 3), creo un vettore relativo alla 3a colonna della matrice.
Se volessi creare un vettore:
A1=mat(:, 1)
A2=mat(:, 2)
A3=mat(:, 3)
A4=mat(:, 4)...............

come potrei fare?

Grazie in anticipo.

13 Risposte

  • Re: Creare tanti vettori quante sono le colonne della matrice

    In teoria è possibile creare delle variabili (dei vettori, nel tuo caso) in modo automatico, ma è assolutamente sconsigliato.

    Puoi tranquillamente lavorare con la matrice ed accedere alle colonne sfruttando le funzionalità di indexing: perchè creare un vettore, ad esempio "A1" quando puoi usare direttamente "mat(:,1)"?

    Se proprio non vuoi lavorare con la matrice, puoi creare una struct e definire i nomi dei campi in modo automatico:
    
    for i=1:size(mat,2)
       my_struct.(['A' num2str(i)])=mat(:,i)
    end
    
    Questo crea la struct "my_struct" con campi "A1", "A2", ..., ma mi sembra una complicazione eccessiva e non ne vedo l'utilità pratica.
  • Re: Creare tanti vettori quante sono le colonne della matrice

    In effetti sono pienamente d'accordo con te. Avevo pensato a questa soluzione perché ho una matrice in cui sono presenti delle celle vuote. In pratica dovrei eliminare tutte le righe della matrice in cui compare una cella vuota. Il problema è che dovrei lavorare su ogni colonna della matrice indipendentemente dalle altre.
    Cerco di essere più chiara.
    La mia matrice è strutturata nel seguente modo:
    - lungo la prima riga sono riportate 50 stazioni pluviometriche;
    -lungo la prima colonna, gli anni di funzionamento.
    I valori all'interno della matrice contengono i dati di precipitazione. Ogni colonna contiene un diverso numero di celle vuote.
    Eliminando tutte le righe in cui compare una cella vuota, non ho più il dato di precipitazione (di ogni stazione) che corrisponde all'effettivo anno di funzionamento. Ovvero ottengo una matrice in cui, per ogni colonna, vengono eliminati anche i dati che effettivamente mi occorrono.
  • Re: Creare tanti vettori quante sono le colonne della matrice

    Mi sembra di capire che importi la matrice da un file. E' così?

    Se sì:
    [*] in che formato è il file? Excel? CSV?, altro?
    [*] come importi il file? Quale funzione usi?

    Dal momento che n MatLab non puoi avere celle vuote, cosa intendi con "celle vuote" nella matrice?

    Se importi i dati da un file ci sono diversi modi per "leggerlo" e settare le celle vuote, per esempio con il valore "NaN"; molte funzoni di MatLab offrono la possibilità di trattare in modo particolare i valori "NaN", in alternativa, potresti, successivamente sostituire i valori "NaN" con altri valori (ad esempio -99999, 0, -Inf, o altro).
  • Re: Creare tanti vettori quante sono le colonne della matrice

    Si,esatto. Sto importando la matrice da un file Excel.
    La funzione che ho usato è "xlsread".
    Per celle vuote intendo che ci sono delle celle della matrice in cui compare "NaN".
  • Re: Creare tanti vettori quante sono le colonne della matrice

    Quali operazioni vuoi effettuare sui vettori?

    Come vuoi trattare le celle "vuote"? Vuoi escluderle?

    Ci sono funzioni, ad esempio "mean" (che ritorna la media dei valori in input) che consentono di specificare se / come trattare i valori "NaN".

    Se proprio vuoi eliminare le celle "vuote" non puoi usare una matrice (tutte le righe devono avere lo stesso numero di colonne), ma devi creare un cellarray.
    
    % Creazione di una matrice di esempio
    m=randi(10,6)
    % Inserimento di alcuni valori NaN
    m(randi(6,2,2),randi(6,2,1))=NaN
    % Identificazione delle dimensioni della matrice originale
    [rows,columns]=size(m)
    % Creazione di un cellarray
    new_cell=cell(rows,1)
    % Eliminazione dei valori NaN ed assegnazione dei valori rimasti alla i-esima riga del cellarray
    for i=1:rows
       new_cell(i,:)=m(i,~isnan(m(i,:)))
    end
    
  • Re: Creare tanti vettori quante sono le colonne della matrice

    Utilizzando il tuo codice mi dà questo errore:

    Conversion to cell from double is not possible.

    Error in Untitled (line 11)
    new_cell(i,:)=m(i,~isnan(m(i,:)))

    Per rispondere alle tue domande:
    -le celle "vuote" vorrei escluderle
    - su ogni vettore devo calcolare lo scarto tra il dato di partenza e la media dei valori di ogni colonna e poi devo "graficarlo".
  • Re: Creare tanti vettori quante sono le colonne della matrice

    Ho testato il codice con Octave e funziona, forse dipende dalle (poche) differenze tra MatLab ed Octave, appena posso verifico con MatLab (al momento non ho accesso a MatLab).
  • Re: Creare tanti vettori quante sono le colonne della matrice

    Fatto salvo che la funzione "mean" consente sia di includere che escludere i valori "NaN", dal momento che in MatLab tuttel le righe di una matrice devono avere lo stesso numero di colonne, che La cosa più semplice che puoi fare, se proprio vuoi eliminare i valori "NaN" è creare una "struct" nella quale ogni campo(field) contenga i valori di una colonna.

    In questo esempio viene creata la struttura "data_struct" con i campi:

    data_struct.all_data ==> matrice completa
    data_struct.column_x (x = i-esima colonna) ==> dati della i-esima senza "NaN"
    data_struct.nan_column_x (x = i-esima colonna) ==> indice della riga della i-esima colonna nel quale era presente il valore NaN

    Sfruttando la possibilità di definire i nomi dei campi in modo dinamico, puoi sostituire la generica stringa "column" con il nome della colonna che leggi dal file Excel.

    Così come pupi definire in modo dinamico i nomi dei campi, puoi usare la funzione "fieldnames" () per accedere in modo dinamico ai campi che hai creato.
    
    % Creazione di una matrice di esempio
    m=randi(10,6)
    % Inserimento di alcuni valori NaN
    m(randi(36,6,1))=NaN
    % Identificazione delle dimensioni della matrice originale
    [rows,columns]=size(m)
    % Creazione della struttura dati:
    % data_struct.all_data ==> matrice completa
    % data_struct.column_x (x = i-esima colonna) ==> dati della i-esima colonna
    %                                                senza "NaN"
    % data_struct.nan_column_x (x = i-esima colonna) ==> indice della riga
    % della i-esima colonna nel quale era presente il valore NaN
    
    data_struct.all_data=m
    for i=1:columns
       data_struct.(['column_' num2str(i)])=m(~isnan(m(:,i)),i)
       data_struct.(['nan_column_' num2str(i)])=find(isnan(m(:,i)))
    end
    
  • Re: Creare tanti vettori quante sono le colonne della matrice

    Innanzitutto ti ringrazio per avermi risposto. Ho un'ultima cosa da chiederti: una volta creata la "struttura di dati" le operazioni da eseguire sulla struttura richiedono una formattazione particolare? Se ad esempio volessi eseguire la media?
  • Re: Creare tanti vettori quante sono le colonne della matrice

    Non servono formattazioni particolari.
    Ho modificato l'esempio riportato nella risposta precedente in modo che estragga i valori "non NaN" e calcoli alcuni parametri: media, deviazione standard, minimo e massimo.

    Se chiami la funzione "xlsread" con tre parametri di output, dovresti ottenere gli "header" delle colonne e potresti usarli come stringhe al posto di "column" nella creazione della struttura.
    
    % Creazione di una matrice di esempio
    m=randi(10,6);
    % Inserimento di alcuni valori NaN
    m(randi(36,6,1))=NaN
    % Identificazione delle dimensioni della matrice originale
    [rows,columns]=size(m);
    %
    % Estrazioine dei dati
    % Creazione della struttura dati
    % data_struct.column_x (x => numero della colonna) con i campi:
    %   dati: dati estratti dalla matrice (senza i valori NaN)
    %   media: media dei valori
    %   dev_std: deviazione standard
    %   min_val: vettore con il valore minimo della colonna e sua posizinoe (indice) nella colonna
    %   max_val: vettore con il valore massimo della colonna e sua posizinoe (indice) nella colonna
    %
    data_struct.all_data=m;
    for i=1:columns
       % Estrazione dei dati "non NaN" dalla matrice
       vals=m(~isnan(m(:,i)),i);
       % Assegnazione dei dati al campo "dati" della struttura "data_struct.column_x" (x => i-esima colonna)
       data_struct.(['column_' num2str(i)]).dati=vals;
       % Calcolo della media ed assegnazione al campo campo "media" della struttura "data_struct.column_x"
       data_struct.(['column_' num2str(i)]).media=mean(vals);
       % Calcolo della deviazione standard ed assegnazione al campo "dev_std" della struttura "data_struct.column_x"
       data_struct.(['column_' num2str(i)]).dev_std=std(vals);
       % Calcolo dei valori minimo e massimo dei dati ed assegnazione ai campi "min_val" w "max_val" della struttura "data_struct.column_x"
       [min_val idx]=min(vals);
       data_struct.(['column_' num2str(i)]).min_val=[min_val idx];
       [max_val idx]=max(vals);
       data_struct.(['column_' num2str(i)]).max_val=[max_val idx];
       % Identificazine degli indici della riga nella quale erano presenti i valori "NaN" ed assegnazione al campo "min_max" della struttura "data_struct.column_x"
       data_struct.(['nan_column_' num2str(i)]).nan_val=find(isnan(m(:,i)));
    end
    
  • Re: Creare tanti vettori quante sono le colonne della matrice

    Come faccio ad estrarre da un file Excel anche la stringa di testo?
    Ho pensato in questo modo:

    [z t]=xlsread('Precipitazioni.xlsx'
  • Re: Creare tanti vettori quante sono le colonne della matrice

    In base a quanto riportato nella documentazione della funzione "xlsread" (http://it.mathworks.com/help/matlab/ref/xlsread.html#bthgbmn) se chiami la funzione specificando tre parametri di output, dato un file contenente:
    
       First    Second    Third
           1         2        3
           4         5        x    
           7         8        9
    
    dovresti ottenere:
    
    [num,txt,raw] = xlsread('myExample.xlsx')
    
    num =
         1     2     3
         4     5   NaN
         7     8     9
    
    txt = 
        'First'    'Second'    'Third'
        ''         ''          ''     
        ''         ''          'x'    
    
    raw = 
        'First'    'Second'    'Third'
        [    1]    [     2]    [    3]
        [    4]    [     5]    'x'    
        [    7]    [     8]    [    9]
    
    
    "txt" e "raw" sono dei cellarray dai quali puoi estrarre i nomi delle colonne.
  • Re: Creare tanti vettori quante sono le colonne della matrice

    Grazie mille per il tuo aiuto. Sei stato davvero molto gentile =)
Devi accedere o registrarti per scrivere nel forum
13 risposte