2010-12-28 23 views
6

Zastanawiam się, czy można użyć funkcji mat2cell, aby podzielić macierz MxN na 10 podrzędnych o tym samym rozmiarze kolumny, N iw przybliżeniu o tym samym rozmiarze rzędu ~M/10? Jeśli mod(M, 10) == 0 wszystkie podteksty będą miały ten sam rozmiar, w przeciwnym razie kilka matryc będzie miało +/- 1 wiersz. Czy jest to możliwe dzięki funkcji mat2cell?W jaki sposób mogę podzielić macierz na niewymiarowe podmodele?

Dla porównania, jeśli rozmiary wierszy są wszystkie takie same to dość proste, jak wyjaśniono tutaj:
How to divide a matrix into equals parts?

Odpowiedz

5

Oto proste rozwiązanie za pomocą funkcji linspace, round i diff:

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

To podejście spowoduje dystrybucję dodatkowych wierszy w bardziej jednorodny sposób w wynikowych komórkach macierzy komórek. Uwaga tych wyjść, że dostaniesz przy stosowaniu wyżej używając mat = magic(5); (z lewej) i mat = magic(13); (prawy):

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] 

Jeśli wolisz losowe rozmieszczenie dodatkowych wierszy, można użyć randperm tak:

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

+1 - Myślę, że to jest lepsze niż to, co dostarczyłem (chyba, że ​​ktoś chce, aby dodatkowe rzędy były z przodu). – sage

+0

@sage: Podobnie jak w przypadku wielu problemów w MATLAB, zwykle istnieje wiele równie dobrych rozwiązań. Chodzi tylko o to, gdzie chcesz dodatkowe rzędy. ;) – gnovice

3

Jest to możliwe i jest podobny do linku, który podałeś, ale trzeba zdecydować, jak chcesz aby podzielić rzędy "pozostawione", gdy M mod 10 nie jest równe 0 i co zrobisz, jeśli na początku jest mniej niż 10 wierszy. Poniższa powinien działać, jeśli wymienione założenia są poprawne:

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

Założenia:

  1. Będziesz mieć> = 10 rzędów (lub nie przeszkadza posiadające tablice 0xN)
  2. jesteś zadowolony mieć dodatkowe wiersze podzielone między pierwsze macierze - tzn. jeśli masz 13 wierszy, to masz 3 kolejne macierze z 2 rzędami, a następnie 7 macierzy z 1 rzędem.

Na przykład, wpadłem to na X = oka (7) i otrzymała:

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

Ah, bardzo pomocne, dziękuję –