如何在MATLAB中调整矩阵大小?

8
假设我有一个1x12的矩阵,我想将其调整为一个4x3的矩阵。我该如何做呢?
我的现有解决方案有点丑陋:
for n = 1:(length(mat)/3)
    out(n,1:3) = mat( ((n-1)*3 + 1):((n-1)*3 + 3) );
end

有更好的方法吗?

3个回答

24

reshape 当然是正确的解决方案,正如 @gnovice 所述。

reshape 的一个不错的特性是它允许这样做:

A = 1:12;
B = reshape(A,4,[]);
B =
     1     5     9
     2     6    10
     3     7    11
     4     8    12

所以如果你不知道有多少列,reshape会为你计算。同样,如果你省略了行数,reshape也会填充。

C = reshape(A,[],4)
C =
     1     4     7    10
     2     5     8    11
     3     6     9    12

2
+1:很好!我以前从没注意过这个。我想我以前从来没有用过它。 - gnovice

12

尝试使用RESHAPE函数:

A = (1-by-12 matrix);
B = reshape(A,4,3);
注意,矩阵B将以列为主的方式从A中获取元素进行填充(即列将从上到下,从左到右进行填充)。
示例:
>> A = 1:12;
>> B = reshape(A,4,3)

B =

     1     5     9
     2     6    10
     3     7    11
     4     8    12

请注意,如果A的元素数量不恰好为4*3,则reshape会返回一个错误。 - AnnaR
是的,这是 RESHAPE 的正常预期行为。 - gnovice
1
我们不能告诉 RESHAPE 如果没有恰好 4*3 个元素就添加零吗?我的意思是如果少于 12 个元素。 - Nadeeshani Jayathilake
1
@Nadeeshani:不行,但你可以用这个代替:A = 1:11; B = zeros(4,3); B(1:numel(A)) = A; - gnovice
@govice A = 1:11; B = zeros(4,3); B(1:numel(A)) = A; 这是按列进行的吗? - Parth Sane
1
@Boggartfly:是的,这将按列填充B。如果您想按行填充,我会这样做:A = 1:11; B = zeros(3,4); B(1:numel(A)) = A; B = B.'; - gnovice

9

为了扩展gnovice的解决方案:

如果您需要不同顺序的矩阵构建,请使用转置('运算符)或permute()在调用reshape()之后更改维度排序。


+1:关于转置和PERMUTE的观点很好。这些有时需要在重塑之后使用。 - gnovice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接