开发者

How can I rearrange the columns of this matrix?

Given a binary matrix in which every row and col开发者_StackOverflow社区umn contains exactly only one 1, I need to rearrange the matrix columnwise so that it will become an identity matrix. For example, given a binary matrix:

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 ]

To get the identity matrix we rearrange the column as 2 3 1 5 4.

How can we optimally rearrange the columns for any given arbitrary square binary matrix?


A very simple way to do this is to use the function FIND like so:

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

And you can test that it work as follows:

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

OLD APPROACH:

This isn't as compact or efficient as the above solution, but you could also transpose the matrix and use SORTROWS to sort the columns (now transposed into the rows) and return the sort indices. This will actually sort values in ascending order, which will give you an anti-diagonal matrix, so you will want to flip the vector of indices using FLIPUD. Here's the code:

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


If you know the matrix can be manipulated into an identity matrix, why don't you just create an identity matrix with the same dimensions?

identity_matrix=eye(length(Binary))
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜