原
Matlab 矩阵操作函数- reshape repmat permute squeeze flip
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
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来具体实现矩阵的左右和上下翻转。