这是一个有点愚蠢的问题,但我似乎无法弄清楚permute在matlab中是如何工作的.以文档为例:
A = [1 2; 3 4]; permute(A,[2 1])
ans =
1 3
2 4
Run Code Online (Sandbox Code Playgroud)
到底是怎么回事?这如何告诉matlab 3和2需要交换?
Özg*_*gür 17
哇,这是我在目前使用的所有不同SDK中找出最难的功能之一.因此,在"我理解置换功能的旅程"中,我多次使用F*ck字.以下是一些可以防止您遭受类似难以忍受的痛苦的例子:
首先,让我们记住matlab中矩阵的维度名称:A = zeros(4,5,7)
矩阵A有4行,5列和7页.如果您没有指定维度,则其默认计数设置为1.(即B=zeros(10,3)
有10行,3列和1页,此顺序很重要!)
order
传递的参数permute
是在矩阵中交换这些维度并产生一个笨拙的数组组合,我认为permute
这种效果的用词不当.
现在让我们转到示例,最后:
% A has 4 rows, 2 columns and 1 page
A =[ 5 6
8 2
2 2
1 3];
% (numbers in the order argument of permute function indicates dimensions,
% 3 = page , 2 = column and 1 = row dimensions):
B = permute(A,[3,2,1]); % [3,2,1] means [ page,column,row]
C = permute(A,[3,1,2]); % [3,1,2] means [ page,row,column]
D = permute(A,[1,3,2]); % [1,3,2] means [ row,page,column]
E = permute(A,[2,3,1]); % [2,3,1] means [ column,page,row]
F = permute(A,[2,1,3]); % [2,1,3] means [ column,row,page]
G = permute(A,[1,2,3]); % [1,2,3] means [ row,column,page]
Run Code Online (Sandbox Code Playgroud)
解释:
B = permute(A,[3,2,1]);
Run Code Online (Sandbox Code Playgroud)
1x2x4(页面(3)维度A = 1,列(2)维度A = 2,行(1)维度A = 4; 1是行维度,2是列维度,4是生成的B的页面维度继续阅读,直到你理解为止)因此,将有4个1x2(1x2x4)行矩阵.如:
ans(:,:,1) =
5 6
ans(:,:,2) =
8 2
ans(:,:,3) =
2 2
ans(:,:,4) =
1 3
Run Code Online (Sandbox Code Playgroud)
*
C = permute(A,[3,1,2]);
Run Code Online (Sandbox Code Playgroud)
1x4x2(页面(3)维度A = 1,行(1)维度A = 4,列(2)维度A = 2; 1是行维度,4是列维度,2是生成的C的页面维度)因此,将有2个1x4(1x4x2)行矩阵.如:
ans(:,:,1) =
5 8 2 1
ans(:,:,2) =
6 2 2 3
Run Code Online (Sandbox Code Playgroud)
*
D = permute(A,[1,3,2]);
Run Code Online (Sandbox Code Playgroud)
4x1x2(A(4)的行(1)维度,A = 1的页面(3)维度,A = 2的列(2)维度; 4是行维度,1是列维度,2是生成的D的页面维度)因此,将有2个4x1(4x1x2)列矩阵.如:
ans(:,:,1) =
5
8
2
1
ans(:,:,2) =
6
2
2
3
Run Code Online (Sandbox Code Playgroud)
*
E = permute(A,[2,3,1]);
Run Code Online (Sandbox Code Playgroud)
2x1x4(A = 2的列(2)维度,A = 1的页面(3)维度,A = 4的行(1)维度; 2是行维度,1是列维度,4是生成的E的页面维度)因此,将有4个2x1(2x1x4)列矩阵.如:
ans(:,:,1) =
5
6
ans(:,:,2) =
8
2
ans(:,:,3) =
2
2
ans(:,:,4) =
1
3
Run Code Online (Sandbox Code Playgroud)
*
F = permute(A,[2,1,3]); % this is transpose and same as [2,1]
Run Code Online (Sandbox Code Playgroud)
2x4x1(A列的列(2)维度= 2,行的(1)维度A = 4,页面(3)维度A = 1; 2是行维度,4是列维度,1是生成的F的页面维度)因此,将有1个2x4(2x4x1)矩阵.如:
ans =
5 8 2 1
6 2 2 3
Run Code Online (Sandbox Code Playgroud)
*
G = permute(A,[1,2,3]); % this makes no difference, using to show the reasoning
Run Code Online (Sandbox Code Playgroud)
4x2x1(A(4)的行(1)维度,A = 2的列(2)维度,A = 1的页面(3)维度; 4是行维度,2是列维度,1是生成的G的页面维度)因此,将有1个4x2(4x2x1)矩阵(本身!).如:
ans =
5 6
8 2
2 2
1 3
Run Code Online (Sandbox Code Playgroud)
是的,这看起来很难,而且确实很难!要检查您是否完全理解,请尝试预测方形矩阵的类似不同排列.玩得开心,我的意思是减少痛苦:)
permute
对数组的维度进行排列,而不是对其元素进行排列,就像人们对其名称所期望的那样.
因此,permute(A,[2,1])
翻转具有数组A
1(行)的数组的维2(列)A
,这相当于transpose(A'
).
permute(A,[3,2,1])
将产生1乘2乘2的阵列(因为size(A,3)==1
),其中阵列"水平向上翻转".