Creazione matrice

di il
1 risposte

Creazione matrice

Buon Giorno a tutti, sono nuovo del forum e volevo sottoporvi questo problema
io ho una colonna in formati txt con 1800 valori numerici, mi servirebbe il modo per creare una matrice di n colonne per 50 righe (in questo caso 36 colonne per 50 righe) .....come posso fare ?
Mi spiego, a seconda dei dati che ho vorre una matrice di lunghezza fissa (50) e larghezza a seconda del numero di dati

grazie in anticipo per l'aiuto

1 Risposte

  • Re: Creazione matrice

    Per riorganizzare un vettore in una matrice si può usare la funzione built-in "reshape".
    La funzione reshape opera in modo "column-wise": dato il vettore

    a=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18];

    se lo si vuole riorganizzare in una matrice (6 x 3) è sufficiente l'istruzione:

    b=reshape(a,6,3);

    Purtroppo non sono riuscito a trovare una funzione built-in che consenta di effettuare il "reshaping row-wise"; tuttavia lo stesso si può effettuare utilizzando un "ciclo for" come nello script in calce (lo script consente di scegliere la tipologia di reshaping: column-wise o row-wise).

    Una soluzione alternatica (e forse più efficiente) all'utilizzo di un ciclo for può essere costituita dallo scrivere uno script in AWK (o PERL, Python, ecc.) che operi sul vettore "a" quando questo sia stato scritto in un file di testo.
    Un possibile script per AWK è proposto dopo lo script Matlab; fondamentalmente, lo script "AWK" crea un file ".m" all'interno del quale scrive il vettore opportunamente riorganizzato in forma di matrice.
    Il file ".m" può quindi essere direttamente utilizzato in MAtLab.

    Script MatLab
    
    %
    % Creazione del vettore "a"
    %
    a=1:18;
    %
    % Identificazione lunghezza del vettore in input
    %
    lung_a=length(a);
    %
    % Definizione del numero di righe volute
    %
    n_r=6;
    %
    % Definizione della modalità di "reshape":
    %    reshape_column_wise=1 ==> modalità standard di MatLab
    %    reshape_column_wise=0 ==> modalità alternatica, row-wise
    %
    reshape_column_wise=0;
    %
    % Calcolo del numero risultante di colonne
    %
    n_c=lung_a/n_r;
    %
    % Verifica della compatibilità del numero di righe con la lunghezza del
    % vettore "a" (la funzione "reshape ritorna "errore" se il vettore che si
    % vuole trasformare in una matrice non ha un numero di elementi uguale a
    % "n_r * n_c"
    %
    if((floor(n_c) ~= n_c))
       disp(sprintf('Errore: numero righe richieste= %d',n_r))
       disp(sprintf('Numero colonne attese= %d',n_c))
       disp(sprintf('Il vettore in input non ha %d x %d elementi',n_r,n_c))
       disp(sprintf('Lunghezza del vettore= %d',lung_a))
    else
       if(reshape_column_wise)
          %
          %       Invocazione funzione built-in di MatLab (column-wise)
          %
          disp('Reshaping "a" column-wise')
          a
          b=reshape(a,n_r,n_c)
       else
          %
          %       Reshape "row_wise" (Metodo "naive" - ciclo for)
          %
          disp('Reshaping "a" row-wise')
          b=zeros(n_r,n_c);
          j=1;
          for i=1:n_c:lung_a
             b(j,1:n_c)=a(i:i+n_c-1);
             j=j+1;
          end
          a
          b
       end
    end
    
    Script AWK
    
    
    BEGIN {
    i=1;
    print "b=[" > "reshaped_a.m"
    }
    {
    if(length($1))
       {
          if(i == 6)
             {
                printf("%d \n",$1) > "reshaped_a.m";
                i=1;
             }
          else
             {
                printf("%d ",$1) > "reshaped_a.m";
                i++;
             }
       }
    }
    END {
    printf("];\n") > "reshaped_a.m";
    }
    
    Risultati ottenuti lanciando lo script MatLab nelle due modalità (column-wise / row_wise)
    Reshaping "a" column-wise
    a =
    Columns 1 through 11
    1 2 3 4 5 6 7 8 9 10 11
    Columns 12 through 18
    12 13 14 15 16 17 18
    b =
    1 7 13
    2 8 14
    3 9 15
    4 10 16
    5 11 17
    6 12 18

    Reshaping "a" row-wise
    a =
    Columns 1 through 11
    1 2 3 4 5 6 7 8 9 10 11
    Columns 12 through 18
    12 13 14 15 16 17 18
    b =
    1 2 3
    4 5 6
    7 8 9
    10 11 12
    13 14 15
    16 17 18
    Hope this helps.
Devi accedere o registrarti per scrivere nel forum
1 risposte