【问题标题】:blocking matrix in matlabmatlab中的阻塞矩阵
【发布时间】:2013-02-20 14:17:01
【问题描述】:

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

【问题讨论】:

  • 15x18 分成 30x35 近 4 倍,而不是 2 倍。

标签: matlab matrix


【解决方案1】:

您可以通过复制矩阵(两次)然后将您想要的部分设置为 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

【讨论】:

  • 没错,但我想要的是通过使用更改块数来提供灵活性,我将其分为两部分,但我想要的是动态块数可以是 2,4, 8,16 这样。
  • 你能不能把它应用到我不能很好理解的例子上?!
【解决方案2】:

你看过blockproc吗?

【讨论】:

  • 是的,但由于处理的乐趣,我无法得到它,并且想使用循环或类似的方式抛出该矩阵,因为块数可能不同且矩阵大小
猜你喜欢
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 2014-09-18
  • 2018-12-02
  • 1970-01-01
相关资源
最近更新 更多