2010-12-28 200 views
6

Me pregunto si es posible utilizar la función mat2cell para dividir una matriz MxN en 10 submatrices con el mismo tamaño de columna, N, y aproximadamente el mismo tamaño de fila ~M/10? Si es mod(M, 10) == 0, todas las sub matrices tendrán el mismo tamaño; de lo contrario, algunas matrices tendrán +/- 1 fila. ¿Es esto posible a través de la función mat2cell?¿Cómo puedo dividir una matriz en submatrices de tamaño desigual?

Como referencia, si los tamaños de fila son todos del mismo es bastante sencillo, como se explica aquí:
How to divide a matrix into equals parts?

Respuesta

5

Aquí es una solución sencilla de utilizar las funciones linspace, round y diff:

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

Este enfoque distribuirá filas adicionales de manera más uniforme a través de las celdas resultantes de la matriz de celdas. Tenga en cuenta estas salidas que se llega cuando se aplica la anterior utilizando mat = magic(5); (izquierda) y mat = magic(13); (derecha):

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] 

Si prefiere una distribución aleatoria de filas adicionales, puede utilizar randperm así:

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

+1 - Creo que esto es mejor que lo que proporcioné (a menos que uno quiera que las filas adicionales se agrupen en la parte frontal). – sage

+0

@sage: al igual que con muchos problemas en MATLAB, generalmente hay una cantidad de soluciones igualmente buenas. Es solo una cuestión de dónde quieres las filas adicionales. ;) – gnovice

3

Esto es posible y es similar a la dirección que nos ha facilitado, pero hay que decidir cómo desea para dividir las filas 'sobrantes' cuando M mod 10 no es 0 y lo que harás si hay menos de 10 filas para empezar. Lo siguiente debería funcionar si los supuestos mencionados son válidos:

[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);

Supuestos:

  1. Tendrá> = 10 filas (o que no les importa tener matrices 0xN)
  2. Usted está contenido tener las filas adicionales divididas entre las primeras matrices, es decir, si tienes 13 filas, entonces tienes 3 matrices consecutivas con 2 filas, seguidas de 7 matrices de 1 fila.

Por ejemplo, me encontré con esto en X = ojo (7) y tiene:

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

Ah, muy útil, gracias –

Cuestiones relacionadas