将任何N * M矩阵拆分为子矩阵的相等部分

时间:2016-11-03 16:28:26

标签: matlab

我想将任何矩阵拆分成子矩阵的相等部分。我使用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 个答案:

答案 0 :(得分:0)

如果您只是尝试用零填充空白区域,最简单的方法就是在拆分之前填充初始矩阵:

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

如果您更喜欢用NaN填充,只需将其替换为上面的代码,我用零填充:

% 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))];