【问题标题】:Split any N*M matrix into equal part of sub matrices将任何 N*M 矩阵拆分为相等的子矩阵部分
【发布时间】:2016-11-03 16:28:26
【问题描述】:

我想将任何矩阵分成相等的子矩阵部分。我使用 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);

【问题讨论】:

  • 你知道 973/216 不是整数吗?那么你怎么能平分这样的矩阵呢?这里没有奇迹。
  • @obchardon 我知道。所以我必须调整矩阵的大小以便我可以平均分割,这是唯一的方法吗?
  • 这取决于您的需要,您可以对矩阵进行插值以适应 n*216 大小,您可以将矩阵划分为 49 139*139 个子矩阵,...
  • @obchardon 是的,我认为最好采用最接近我的矩阵维度的 n*216 大小。像 4*216 = 864 所以我可以将矩阵调整为 864*864
  • 所以你可以使用imresize

标签: matlab


【解决方案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

如果您想用 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))]; 

【讨论】:

  • 其实我想根据块大小调整我的初始矩阵。像 963*963 矩阵块大小 (963/216) != integer .SO 我想取最接近的整数 M 其中 M/216 == 0 和 M
  • 如果你想扔掉数据,拿我的代码,把天花板变成地板,去掉填充线
猜你喜欢
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
相关资源
最近更新 更多