Как я могу разделить матрицу на подматрицы неравного размера? - PullRequest
6 голосов
/ 29 декабря 2010

Мне интересно, можно ли использовать функцию mat2cell для разделения матрицы MxN на 10 подматриц с одинаковым размером столбца N и приблизительно одинаковым размером строки ~M/10? Если mod(M, 10) == 0, то все подматрицы будут иметь одинаковый размер, иначе несколько матриц будут иметь +/- 1 строку. Возможно ли это через функцию mat2cell?

Для справки, если размеры строк все одинаковые, это довольно просто, как объяснено здесь:
Как разделить матрицу на равные части?

Ответы [ 2 ]

5 голосов
/ 29 декабря 2010

Вот простое решение с использованием функций linspace, round и diff:

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

Этот подход будет распределять дополнительные строки более равномерно по результирующим ячейкам массива ячеек.Обратите внимание на следующие выходные данные, которые вы получите при применении вышеуказанного с использованием mat = magic(5); (слева) и mat = magic(13); (справа):

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]

Если вы предпочитаете случайное распределение дополнительных строк, вы можете использоватьrandperm вот так:

subSizes = diff(round(linspace(0, M, nSub+1)));
cMat = mat2cell(mat, subSizes(randperm(nSub)), N);
3 голосов
/ 29 декабря 2010

Это возможно и похоже на указанную вами ссылку, но вам нужно решить, как вы хотите разделить «оставшиеся» строки, когда M mod 10 не равно 0, и что вы будете делать, если строк меньше 10начать с.Следующее должно работать, если перечисленные предположения верны:

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

Допущения:

  1. У вас будет> = 10 строк (или вы не против иметь массивы 0xN)
  2. Вы довольны тем, что дополнительные строки разделены между первыми матрицами - то есть, если у вас есть 13 строк, то у вас есть 3 последовательные матрицы с 2 строками, за которыми следуют 7 матриц по 1 строке.

Например, я запустил это на X = eye (7) и получил:

Y = 
 [1x7 double]
   ...
 [1x7 double]
 [0x7 double]
 [0x7 double]
 [0x7 double]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...