在Matlab中构建子矩阵中的列

时间:2013-05-25 13:16:55

标签: matlab octave

在Matlab中,我正在尝试将矩阵A转换为另一个矩阵B,以便B的列由A的方形子矩阵组成。例如,如果A是:

A = [1 1 2 2
     1 1 2 2
     3 3 4 4
     3 3 4 4];

我希望B成为:

B = [1 2 3 4
     1 2 3 4
     1 2 3 4
     1 2 3 4]

A可以是16比16,并且从4比4的方格构建B会导致B为4乘64。

是否有一种有效的方法可以将reshape与其他命令结合使用?还是其他一些方法?我目前正在迭代循环,这对于大量的大型源矩阵非常慢。

1 个答案:

答案 0 :(得分:1)

假设您的矩阵更通用,并且由3x2块组成:

A = [1 1 2 2 
     1 1 2 2
     1 1 2 2
     3 3 4 4
     3 3 4 4
     3 3 4 4
     5 5 6 6
     5 5 6 6
     5 5 6 6];

b   = [3 2];
szA = size(A);

移调,重塑,置换,重塑。

nb   = prod(szA./b); % Number of blocks
nelb = prod(b);      % Number of elements per block
out1 = reshape(permute(reshape(A',szA(2),b(1),szA(1)/b(1)),[2,1,3]),nelb,nb)

或者,速度较慢,内存密集,但更具可读性:

d1  = repmat(b(1),1,szA(1)/b(1));
d2  = repmat(b(2),1,szA(2)/b(2));
out = reshape(mat2cell(A,d1,d2)',1,nelb);
out = reshape([out{:}],nelb,nb)

现在,如果块是正方形,只需设置b = [2,2]b = [3,3]等等,或简化删除bprod索引的一般公式。

相关问题