【问题标题】:How can I rearrange the columns of this matrix?如何重新排列此矩阵的列?
【发布时间】:2011-06-01 15:35:44
【问题描述】:

给定一个二进制矩阵,其中每一行和每一列都只包含一个 1,我需要按列重新排列矩阵,使其成为单位矩阵。例如,给定一个二进制矩阵:

Binary = [ 0     1     0     0     0
           0     0     1     0     0
           1     0     0     0     0
           0     0     0     0     1
           0     0     0     1     0 ]

为了得到单位矩阵,我们将列重新排列为2 3 1 5 4

对于任何给定的任意二元方阵,我们如何才能以最佳方式重新排列列?

【问题讨论】:

  • 您的问题是关于如何确定需要什么订单,或者只是如何执行重新排序本身?
  • @Oli Charlesworth:关于有效地将二进制矩阵转换为单位矩阵所需的顺序

标签: matlab sorting matrix


【解决方案1】:

一个非常简单的方法是像这样使用函数FIND

[index,~] = find(Binary.');  %'# Transpose the matrix and find the row indices
                              %#   of the non-zero entries

您可以测试它的工作方式如下:

>> Binary(:,index)

ans =

     1     0     0     0     0    %# Yup, that's an identity matrix alright!
     0     1     0     0     0
     0     0     1     0     0
     0     0     0     1     0
     0     0     0     0     1

旧方法:

这不如上述解决方案紧凑或高效,但您也可以转置矩阵并使用SORTROWS 对列进行排序(现在转置为行)并返回排序索引。这实际上将按升序对值进行排序,这将为您提供一个反对角矩阵,因此您需要使用FLIPUD 翻转索引向量。代码如下:

[~,index] = sortrows(Binary.');  %'# Transpose and sort the matrix
index = flipud(index);            %# Flip the index vector

【讨论】:

    【解决方案2】:

    如果您知道矩阵可以被处理成单位矩阵,为什么不直接创建一个具有相同维度的单位矩阵?

    identity_matrix=eye(length(Binary))
    

    【讨论】:

    • 可能是因为他需要这个矩阵的索引来操作另一个矩阵...
    • @yoda:问题中没有说明。
    猜你喜欢
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多