假设我有一个矩阵,我们称它为a,如下所示:
1 2 3 4 5 1 2 3 4 5
0 2 4 6 8 1 3 5 7 9
我想把它重塑成这样一个矩阵:
1 2 3 4 5
0 2 4 6 8
1 2 3 4 5
1 3 5 7 9
所以,基本上,我想做的是,MATLAB首先读取一个大小为(2,5(的块,然后将剩余的矩阵拆分到下一行,然后重复这个过程,以此类推,直到我们得到类似于我的例子的东西。
我试着用MATLAB的整形命令以多种方式来做这件事,但我失败了。感谢您的帮助。如果重要的话,我的原始数据会更大。是(21080(。谢谢
我不相信你能在一个命令中做到这一点,但也许有人会纠正我的错误。如果速度不是一个大问题,for循环应该可以正常工作。
或者,你可以通过重塑A的每一行,然后将结果放入新矩阵的每隔一行来获得结果。这也适用于较大的数据。
A = [1 2 3 4 5 1 2 3 4 5
0 2 4 6 8 1 3 5 7 9];
An = zeros(numel(A)/5, 5); % Set up new, empty matrix
An(1:2:end,:) = reshape(A(1,:), 5, [])'; % Write the first row of A to every other row of An
An(2:2:end,:) = reshape(A(2,:), 5, [])' % Write second row of A to remaining rows
An=
1 2 3 4 5
0 2 4 6 8
1 2 3 4 5
1 3 5 7 9
您可能需要阅读Matlab文档中有关索引的更多信息。
对于您的示例,很容易执行以下
A=[1 2 3 4 5 1 2 3 4 5; 0 2 4 6 8 1 3 5 7 9]
a1=A(:,1:5); % extract all rows, and columns from 1 to 5
a2=A(:,6:end); % extract all rows, and columns from 6 to end
B=[a1;a2] % construct a new matrix.
构建某种循环来提取其余部分并不困难
以下是使用reshape
和permute
命令在一行中执行此操作的方法:
B = reshape(permute(reshape(A,2,5,[]), [1,3,2]), [], 5);
reshape(A,2,5,[])
命令将A矩阵重塑为维度为2 x 5 x nblocks
的三维张量,其中nblocks
是A在水平方向上的块数。permute
命令然后交换该3D张量的二维和三维,使其成为2 x nblocks x 5
张量。最后的CCD_ 8命令然后将3D张量转换为维度为CCD_ 9的矩阵。
看看每个阶段的结果可能会让你更好地了解正在发生的事情。