了解重塑函数如何形成矩阵

时间:2014-06-10 10:11:22

标签: matlab matrix reshape

让我们考虑使用矩阵进行说明

A=rand(6,3)

A =

    0.3500    0.8308    0.7537
    0.1966    0.5853    0.3804
    0.2511    0.5497    0.5678
    0.6160    0.9172    0.0759
    0.4733    0.2858    0.0540
    0.3517    0.7572    0.5308

总计我们有6 * 3 = 18个元素,应用重塑函数后

reshape(A,2,9)

ans =

0.3500    0.2511    0.4733    0.8308    0.5497    0.2858    0.7537    0.5678    0.0540
0.1966    0.6160    0.3517    0.5853    0.9172    0.7572    0.3804    0.0759    0.5308

如果我们查看原始数组,那么我们可以很容易地看到这些新矩阵的行与

相同
B=A(:)'

B =

  Columns 1 through 9

    0.3500    0.1966    0.2511    0.6160    0.4733    0.3517    0.8308    0.5853    0.5497

  Columns 10 through 18

    0.9172    0.2858    0.7572    0.7537    0.3804    0.5678    0.0759    0.0540    0.5308

>> B(1:2:18)

ans =

    0.3500    0.2511    0.4733    0.8308    0.5497    0.2858    0.7537    0.5678    0.0540

所以在重塑(A,m,n)中,m * n必须是总元素,m表示第一列中的第一个元素的起始形式,列中的第n个元素的增量?也是当我尝试

reshape(A,3,4)
Error using reshape
To RESHAPE the number of elements must not change.

它给了我错误,所以每当我选择n时,m必须是数组中的元素数除以n对吗?提前感谢

2 个答案:

答案 0 :(得分:1)

Matlab按列存储其矩阵。这意味着在内部它基本上只是一个数组,其中所有列都连接在一起。矩阵的形状是单独存储的。

我不太明白你的最后一个问题,因为你的矩阵A有18个条目,但是你试图将它重塑为一个矩阵,其中3 * 4 = 12个条目

我希望这有助于你

答案 1 :(得分:1)

Reshape用于重新排序元素,如@alex answer 中所述(当然,元素数量不得更改!)。如果您想调整矩阵,请使用indexing

实施例

A = rand(6,6) % Start matrix

A =

    0.0113    0.5362    0.3510    0.7220    0.2084    0.8344
    0.5013    0.9770    0.5221    0.5743    0.8442    0.8102
    0.1214    0.0390    0.9594    0.1385    0.9038    0.6081
    0.2480    0.9165    0.1986    0.3692    0.5135    0.6154
    0.3631    0.9843    0.3697    0.5964    0.6437    0.6901
    0.9978    0.8182    0.1990    0.8273    0.6811    0.2464

使用'[]'删除行或列

A(2:3, :) = [] % This removes 2nd and 3rd lines
A(:, [2 5]) = [] % This further removes 2nd and 5th columns

A =

    0.0113    0.3510    0.7220    0.8344
    0.2480    0.1986    0.3692    0.6154
    0.3631    0.3697    0.5964    0.6901
    0.9978    0.1990    0.8273    0.2464

使用索引进行零填充

AA = zeros(6, 6); % Build larger matrix the size you want ...
AA([1 2 4 6], [2 3 5 6]) = A % Place elements of `A` inside `AA` as you wish ... 

AA =

     0.0000   0.0113   0.3510   0.0000   0.7220   0.8344
     0.0000   0.2480   0.1986   0.0000   0.3692   0.6154
     0.0000   0.0000   0.0000   0.0000   0.0000   0.0000
     0.0000   0.3631   0.3697   0.0000   0.5964   0.6901
     0.0000   0.0000   0.0000   0.0000   0.0000   0.0000
     0.0000   0.9978   0.1990   0.0000   0.8273   0.2464

通过索引,您还可以使用它来创建更大/更小的矩阵。

A([4 4 1 1 2 3], end:-1:1)

ans =

    0.2464    0.8273    0.1990    0.9978
    0.2464    0.8273    0.1990    0.9978
    0.8344    0.7220    0.3510    0.0113
    0.8344    0.7220    0.3510    0.0113
    0.6154    0.3692    0.1986    0.2480
    0.6901    0.5964    0.3697    0.3631