假设我有一个非正方形大小的矩阵,例如 30X35,并且我想拆分成块,例如 4 个块,它就像 15X18 并用零填充添加的单元格,这可以在 matlab 中完成吗?
问问题
151 次
2 回答
0
你看过blockproc
吗?
于 2013-02-20T14:21:35.583 回答
0
您可以通过复制矩阵(两次)然后将您想要的部分设置为 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
于 2013-02-20T14:46:07.043 回答