Разбить любую матрицу N*M на равные части подматриц

Я хочу разбить любую матрицу на равные части подматриц. Для этого я использовал mat2cell. Но это делает большинство подматриц желаемым размером, но некоторые части не равны.
Например: у меня есть матрица размера 973*973. Я хочу разделить поровну на 216 * 216 суб матриц. Когда я применяю mat2cell, он делает 6 * 6 суб матриц. В которой первые 5*5 являются 216 * 216 подматрицами. Но блоки в последней строке и столбцах не 216*216. Это случайные размеры. Что нежелательно.Я хочу, чтобы каждая подматрица имела равное количество строк и столбцов. Каждый блок будет 216 * 216 размер или то, что указано пользователем.

I=imread(file);
[rows columns numberOfColorBands] = size(I);
blockSizeR = 256; % Rows in desired block which can be anynumber.
blockSizeC = 256; % Columns in desired block which can be anynumber.
wholeBlockRows = floor(rows / blockSizeR);
blockVectorR = [blockSizeR * ones(1, wholeBlockRows), rem(rows, blockSizeR)];
% Figure out the size of each block in columns.
wholeBlockCols = floor(columns / blockSizeC);
blockVectorC = [blockSizeC * ones(1, wholeBlockCols), rem(columns, blockSizeC)];

ca = mat2cell(I, blockVectorR, blockVectorC);

1 ответ

  1. Если вы просто пытаетесь заполнить пустые пространства нулями, самый простой способ-просто заполнить начальную матрицу перед ее разделением:

    I=imread(file);
    [rows columns numberOfColorBands] = size(I);
    blockSizeR = 256; % Rows in desired block which can be anynumber.
    blockSizeC = 256; % Columns in desired block which can be anynumber.
    
    % Figure out the size of each block in rows.
    blockRows = ceil(rows / blockSizeR);
    blockVectorR = blockSizeR * ones(1, blockRows);
    
    % Figure out the size of each block in columns.
    blockCols = ceil(columns / blockSizeC);
    blockVectorC = blockSizeC * ones(1, blockCols);
    
    % Pad with zeros
    I(blockRows*blockSizeR,blockCols*blockSizeC) = 0;
    
    % Split it up
    ca = mat2cell(I, blockVectorR, blockVectorC);
    

    Я думаю, что заполнение нулями-лучший путь вперед, потому что в противном случае вы можете столкнуться с I с двумя простыми измерениями, которые не могут быть разделены

    Если вы предпочитаете pad с NaN, просто замените это в приведенный выше код, где я pad с нулями:

    % Pad with NaN
    I = [I, NaN(size(I,1), blockCols*blockSizeC-size(I,2)) ;...
    NaN(blockRows*blockSizeR-size(I,1), size(I,2)) NaN(blockRows*blockSizeR-size(I,1),blockCols*blockSizeC-size(I,2))];