【问题标题】:How does the permute function in matlab workmatlab中的permute函数是如何工作的
【发布时间】:2021-09-10 22:02:14
【问题描述】:

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

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

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

【问题讨论】:

  • MATLAB API 需要更新。一半的函数定义没有任何意义。
  • 您还应该为您的问题 OP 查看更合适的答案。
  • 是的,请这样做:)我花了很多时间:)

标签: matlab


【解决方案1】:

哇,这是我迄今为止使用的所有不同 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(A = 1 的 page(3) 维度,A = 2 的 column(2) 维度,A = 4 的 row(1) 维度;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(A = 1 的 page(3) 维度,A = 4 的 row(1) 维度,A = 2 的 column(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 的 column(2) 维度,A = 1 的 page(3) 维度,A = 4 的 row(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 的 column(2) 维度,A = 4 的 row(1) 维度,A = 1 的 page(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

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

【讨论】:

  • 我认为 OP 不在乎 :)
【解决方案2】:

permute 对数组的维度进行排列,而不是对其元素进行排列,正如人们可能从其名称中所期望的那样。

因此,permute(A,[2,1]) 将数组 A 的第 2 维(列)与数组 A 的第 1 维(行)翻转,相当于转置 (A')。

permute(A,[3,2,1]) 将生成一个 1×2×2 数组(因为 size(A,3)==1),其中数组“水平翻转”。

【讨论】:

    【解决方案3】:

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

    x='abcd'
    

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

    x([3,4,2,1])
    
    ans =
    
    cdba
    

    【讨论】:

      【解决方案4】:

      这是我对 matlab 中置换的理解。

      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])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多