Matlab 中经常需要对矩阵进行维度上的操作,下面做一个简单的总结:
在Matlab中,不管矩阵的维度是多少,数据在内存中的存储都是按照 “行-列-页” 的顺序进行存储的。比如:
>> a = [11,12,13; 21,22,23]
a =
11 12 13
21 22 23
>> a(:)
ans =
11
21
12
22
13
23
>>
有了这个概念之后,理解下面的函数就会很简单。
reshape -- 对矩阵中所有的元素做维度上的重新分配,分配的原则是把内存中的数据按照 “行-列-页” 的顺序填满目的矩阵。(必须保证重新分配后的矩阵与原矩阵元素数量一致):
>> a = [11,12,13; 21,22,23]
a =
11 12 13
21 22 23
>> reshape(a,[3,2])
ans =
11 22
21 13
12 23
>>
repmat -- 把当前矩阵当做单一元素来组合成目标矩阵:
>> a = [11,12,13; 21,22,23]
a =
11 12 13
21 22 23
>> repmat(a,[2,1,2])
ans(:,:,1) =
11 12 13
21 22 23
11 12 13
21 22 23
ans(:,:,2) =
11 12 13
21 22 23
11 12 13
21 22 23
>>
permute -- 改变现有矩阵维度的顺序,函数参数中有一个向量[2, 3, 1]表示第二个维度更改为第一个维度,第三个维度更改为第二个维度,第一个维度变为第三个维度(数字表示原维度编号,数字的位置表示现在维度的编号):
>> a(:,:,1) = [111,121,131; 211,221,231];
>> a(:,:,2) = [112,122,132; 212,222,232]
a(:,:,1) =
111 121 131
211 221 231
a(:,:,2) =
112 122 132
212 222 232
>> permute(a,[2,3,1])
ans(:,:,1) =
111 112
121 122
131 132
ans(:,:,2) =
211 212
221 222
231 232
>>
squeeze -- 去掉矩阵中维度大小为1的维:
>> a
a(:,:,1) =
111
211
a(:,:,2) =
112
212
>> size(a)
ans =
2 1 2
>> b = squeeze(a)
b =
111 112
211 212
>> size(b)
ans =
2 2
>>
flip -- 按照指定的维度号进行矩阵的翻转:
>> a(:,:,1) = [111,121,131; 211,221,231];
>> a(:,:,2) = [112,122,132; 212,222,232]
a(:,:,1) =
111 121 131
211 221 231
a(:,:,2) =
112 122 132
212 222 232
>> fliplr(a)
ans(:,:,1) =
131 121 111
231 221 211
ans(:,:,2) =
132 122 112
232 222 212
>> flip(a,2)
ans(:,:,1) =
131 121 111
231 221 211
ans(:,:,2) =
132 122 112
232 222 212
>> flip(a,1)
ans(:,:,1) =
211 221 231
111 121 131
ans(:,:,2) =
212 222 232
112 122 132
>> flip(a,3)
ans(:,:,1) =
112 122 132
212 222 232
ans(:,:,2) =
111 121 131
211 221 231
>>
其中flip有两个引申出来的函数fliplr、flipud来具体实现矩阵的左右和上下翻转。