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.