如何在Octave中将子矩阵连接成更大的矩阵

时间:2014-11-12 02:38:12

标签: arrays matlab image-processing octave

我正在尝试解决以下问题:我有一个像这样的3x3x4数组:

A(:,:,1) =         A(:,:,2) =         A(:,:,3) =         A(:,:,4) =
  1 1 1              2 2 2              3 3 3              4 4 4
  1 1 1              2 2 2              3 3 3              4 4 4
  1 1 1              2 2 2              3 3 3              4 4 4

我想生成如下所示的6x6矩阵:

B = 
  1 1 1 3 3 3
  1 1 1 3 3 3
  1 1 1 3 3 3
  2 2 2 4 4 4
  2 2 2 4 4 4
  2 2 2 4 4 4

我的第一个想法是使用像重塑函数这样的东西,但由于它按列操作,结果不是我想要的。

您有什么想法有效地执行它吗?

提前致谢

3 个答案:

答案 0 :(得分:2)

由于你的子矩阵大小都相同,你可以将它们直接分配到B:

clear

B = zeros(6);

A(:,:,1) = ones(3);
A(:,:,2) = 2*ones(3);
A(:,:,3) = 3*ones(3);
A(:,:,4) = 4*ones(3);

B = [A(:,:,1) A(:,:,3); A(:,:,2) A(:,:,4)]

B =

     1     1     1     3     3     3
     1     1     1     3     3     3
     1     1     1     3     3     3
     2     2     2     4     4     4
     2     2     2     4     4     4
     2     2     2     4     4     4

如果你有更多的子矩阵,这可能会很麻烦,但可以实现自动化。

答案 1 :(得分:2)

这是将3D数组转换为此类2D数组的一般情况 -

m = 2; %// number of 3D slices to be vertically concatenated to form the rows

m1 = size(A,1)*m;
m2 = size(A,3)/m;

B = reshape(permute(reshape(permute(A,[1 3 2]),m1,m2,[]),[1 3 2]),m1,[])

示例运行 -

A(:,:,1) =
     1     1     7
     1     9     1
     1     7     2
A(:,:,2) =
     3     9     2
     9     4     7
     9     3     7
A(:,:,3) =
     2     6     8
     4     8     4
     1     8     4
A(:,:,4) =
     1     1     7
     8     3     4
     1     9     8
A(:,:,5) =
     7     9     2
     6     8     5
     4     1     6
A(:,:,6) =
     3     2     8
     4     9     1
     4     4     4
B =
     1     1     7     2     6     8     7     9     2
     1     9     1     4     8     4     6     8     5
     1     7     2     1     8     4     4     1     6
     3     9     2     1     1     7     3     2     8
     9     4     7     8     3     4     4     9     1
     9     3     7     1     9     8     4     4     4

答案 2 :(得分:1)

permute效率更高(àDivakar)或手动切片成2D阵列(即Benoit),但我会为未来的读者添加一些内容。我建议的一种方法是取每个平面并将其放入一维单元阵列,将单元阵列重新整形为2 x 2网格,然后将2 x 2网格转换为最终矩阵。类似的东西:

B = arrayfun(@(x) A(:,:,x), 1:4, 'uni', 0);
B = reshape(B, 2, 2);
B = cell2mat(B)

B =

     1     1     1     3     3     3
     1     1     1     3     3     3
     1     1     1     3     3     3
     2     2     2     4     4     4
     2     2     2     4     4     4
     2     2     2     4     4     4