0

在 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,B从 4×4 正方形构建将导致B4×64。

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

4

1 回答 1

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]orb = [3,3]等​​...,或者简化去除b和索引的一般公式prod

于 2013-05-25T13:45:41.580 回答