在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
与其他命令结合使用?还是其他一些方法?我目前正在迭代循环,这对于大量的大型源矩阵非常慢。
答案 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]
等等,或简化删除b
和prod
索引的一般公式。