2013-02-20 160 views
0

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

+0

15x18分成30x35将近4次,而不是2次。 – 2013-02-20 16:11:25

回答

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个块开始于分裂(i)和在分割行第(i-1)-1 finsished。

然后,创建一个空的矩阵:

mAux = zeros(size(m)); 

和内容从米从塔复制分裂(ⅰ)分割第(i + 1)-1

mAux(splits(s):splits(s+1)-1, :) = m(splits(s):splits(s+1)-1, :) 

如果您想要划分所有列的细分,则此示例为ilustrates。如果你想要行和列的子集,你将不得不在两个方向上找到拆分,然后做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 
+0

这是正确的,但我想这是给通过使用改变块的数量的灵活性我把它分成两个例子,但我想要的是块的动态数可能是2,4,8,16那样。 – Alyafey 2013-02-20 14:55:20

+0

可否请你申请它的例子,我无法得到它很好?! – Alyafey 2013-02-20 15:29:41

+0

请参阅编辑的文章。 – fuyas 2013-02-20 15:56:50

0

你看过blockproc

+0

是的,但我无法得到它,因为好玩使用的处理,并希望去使用循环或类似的东西,因为块编号可能是不同的,把那个矩阵的矩阵大小 – Alyafey 2013-02-20 14:34:10