【发布时间】:2013-02-20 14:17:01
【问题描述】:
假设我有一个非正方形大小的矩阵,例如 30X35,我想拆分成块,例如 4 个块,它会像 15X18 并用零填充添加的单元格,这可以在 matlab 中完成吗?
【问题讨论】:
-
15x18 分成 30x35 近 4 倍,而不是 2 倍。
假设我有一个非正方形大小的矩阵,例如 30X35,我想拆分成块,例如 4 个块,它会像 15X18 并用零填充添加的单元格,这可以在 matlab 中完成吗?
【问题讨论】:
您可以通过复制矩阵(两次)然后将您想要的部分设置为 0 来做到这一点:
m = rand([30 35]);
mLeft = m;
mLeft(1:15, :) = 0;
mRight = m;
mRight(16:end, :) = 0;
也可以反过来,先创建一个全为 0 的矩阵,然后复制你感兴趣的内容。
mLeft = zeros(size(m));
mLeft(16:end, :) = m(16:end, :);
可以这样概括:
% find the splits, the position where blocks end
splits = round(linspace(1, numRows+1, numBlocks+1));
% and for each block
for s = 1:length(splits)-1
% create matrix with 0s the size of m
mAux = zeros(size(m));
% copy the content only in block you are interested on
mAux( splits(s):splits(s+1)-1, : ) = m( splits(s):splits(s+1)-1, : )
% do whatever you want with mAux before it is overwriten on the next iteration
end
因此,对于 30x35 示例 (numRows = 30),假设您需要 6 个块 (numBlocks = 6),拆分将为:
splits = [1 6 11 16 21 26 31]
表示第 i 个块从 splits(i) 开始,在 row splits(i-1)-1 结束。
然后你创建一个空矩阵:
mAux = zeros(size(m));
并将m中的内容从splits(i)列复制到splits(i+1)-1:
mAux( splits(s):splits(s+1)-1, : ) = m( splits(s):splits(s+1)-1, : )
此示例说明您是否希望有跨所有列的细分。如果您想要行和列的子集,则必须在两个方向上找到拆分,然后执行 2 个嵌套循环:
for si = 1:legth(splitsI)-1
for sj = 1:legth(splitsj)-1
mAux = zeros(size(m));
mAux( splitsI(si):splitsI(si+1)-1, splitsJ(sj):splitsJ(sj+1)-1 ) = ...
m( splitsI(si):splitsI(si+1)-1, splitsJ(sj):splitsJ(sj+1)-1 );
end
end
【讨论】:
你看过blockproc吗?
【讨论】: