2010-12-28 10 views
6

Mi chiedo se sia possibile utilizzare la funzione mat2cell per dividere una matrice MxN in 10 sottomatrici con la stessa dimensione di colonna, N e circa la stessa dimensione di riga ~M/10? Se mod(M, 10) == 0 allora tutte le sottomatrici avranno la stessa dimensione, altrimenti alcune matrici avranno +/- 1 riga. È possibile ciò tramite la funzione mat2cell?Come posso dividere una matrice in sottomatrici di dimensioni diverse?

Per riferimento, se le dimensioni delle righe sono tutte uguali è abbastanza semplice, come spiegato qui:
How to divide a matrix into equals parts?

risposta

5

Ecco una soluzione semplice utilizzando le funzioni linspace, round e diff:

[M, N] = size(mat); % Matrix size 
nSub = 10;   % Number of submatrices 
cMat = mat2cell(mat, diff(round(linspace(0, M, nSub+1))), N); 

Questo approccio distribuirà le righe aggiuntive in modo più uniforme attraverso le celle risultanti dell'array di celle. Si noti queste uscite che si ottengono quando si applica la sopra utilizzando mat = magic(5); (a sinistra) e mat = magic(13); (destra):

cMat =    cMat = 

    [1x5 double]  [1x13 double] 
    [0x5 double]  [2x13 double] 
    [1x5 double]  [1x13 double] 
    [0x5 double]  [1x13 double] 
    [1x5 double]  [2x13 double] 
    [0x5 double]  [1x13 double] 
    [1x5 double]  [1x13 double] 
    [0x5 double]  [1x13 double] 
    [1x5 double]  [2x13 double] 
    [0x5 double]  [1x13 double] 

Se preferite una distribuzione casuale di righe in più, è possibile utilizzare randperm in questo modo:

subSizes = diff(round(linspace(0, M, nSub+1))); 
cMat = mat2cell(mat, subSizes(randperm(nSub)), N); 
+0

+1 - Penso che questo sia migliore di quello che ho fornito (a meno che non si desideri che le righe in eccesso siano raggruppate in primo piano). – sage

+0

@sage: come con molti problemi in MATLAB, di solito ci sono un numero di soluzioni altrettanto valide. È solo una questione di dove vuoi le righe in più. ;) – gnovice

3

Questo è possibile ed è simile al link che hai fornito, ma è necessario decidere come si desidera per dividere le righe 'rimanenti' quando M mod 10 non è 0 e cosa farai se ci sono meno di 10 righe per cominciare. Il seguente dovrebbe funzionare se le ipotesi elencate sono valide:

[M,N] = size(X); 
Y = mat2cell(X, [repmat(ceil(M/10),[1 mod(M,10)]) ... 
       repmat(floor(M/10),[1 10-mod(M,10)])], N);

Ipotesi:

  1. Avrete> = 10 righe (o non dispiacerebbe avere array 0xn)
  2. Sei contenuti per avere le righe aggiuntive divise tra le prime matrici - cioè se hai 13 righe, allora hai 3 matrici consecutive con 2 righe, seguite da 7 matrici di 1 riga.

Per esempio, ho fatto questo = occhio su X (7) e ottenuto:

Y = 
[1x7 double] 
    ... 
[1x7 double] 
[0x7 double] 
[0x7 double] 
[0x7 double] 
+0

Ah, molto utile, grazie –