matlab中的置换函数如何工作

时间:2014-01-13 19:54:35

标签: matlab

这是一个有点愚蠢的问题,但我似乎无法弄清楚permute在matlab中是如何工作的。以文档为例:

A = [1 2; 3 4]; permute(A,[2 1])
ans =
 1     3
 2     4

发生了什么事?这如何告诉matlab需要交换3和2?

4 个答案:

答案 0 :(得分: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]

<强> 解释:

B = permute(A,[3,2,1]);

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

*

C = permute(A,[3,1,2]);

1x4x2(页面(3)A = 1的维度,A的行(1)维度= 4,A = 2的列(2)维度; 1是行维度,4是列维度,2是页面维度生成的C) 因此,将有2个1x4(1x4x2)行矩阵。如:

ans(:,:,1) =    
      5     8     2     1

ans(:,:,2) =    
      6     2     2     3

*

D = permute(A,[1,3,2]);

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

*

E = permute(A,[2,3,1]);

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

*

F = permute(A,[2,1,3]); % this is transpose and same as [2,1]

2x4x1(A = 2的列(2)维度,A = 4的行(1)维度,A = 1的页面(3)维度; 2是行维度,4是列维度,1是页面维度生成的F) 因此,将有1个2x4(2x4x1)矩阵。如:

 ans =

     5     8     2     1
     6     2     2     3

*

G = permute(A,[1,2,3]); % this makes no difference,  using to show the reasoning

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

是的,这看起来很难,而且确实很难!要检查您是否完全理解,请尝试预测方形矩阵的类似不同排列。玩得开心,我的意思是减少痛苦:)

答案 1 :(得分:5)

permute对数组的维度进行排列,而不是对其元素进行排列,就像人们对其名称所期望的那样。

因此,permute(A,[2,1])翻转数组A的维度2(列)与数组A的维度1(行),这相当于转置({{1} })。

A'将生成一个2乘2的数组(因为permute(A,[3,2,1])),其中数组“水平向上翻转”。

答案 2 :(得分:2)

Jonas已经解释了permute的作用。没有功能来置换元素,因为它可以直接使用索引。

x='abcd'

现在我们想要排列[3,4,2,1]:

x([3,4,2,1])

ans =

cdba

答案 3 :(得分:1)

以下是我在matlab中对permute的理解。

B_ {KJI} = A_ {IJK}

如果您使用

B = permute(a,[3 2 1])

============================

这意味着

B_{211}=a_{112} 
B_{213}=a_{312} 
....

您可以使用以下代码

进行测试
A1=sym('a', [3 4 5])
B1 = permute(A1,[3 2 1])