0

假设我有一个非正方形大小的矩阵,例如 30X35,并且我想拆分成块,例如 4 个块,它就像 15X18 并用零填充添加的单元格,这可以在 matlab 中完成吗?

4

2 回答 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 回答