Как я могу переставить столбцы этой матрицы? - PullRequest
2 голосов
/ 01 июня 2011

Учитывая двоичную матрицу, в которой каждая строка и столбец содержит ровно одну единицу, мне нужно переставить матрицу по столбцам, чтобы она стала единичной матрицей. Например, с учетом двоичной матрицы:

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.

Как мы можем оптимально переставить столбцы для любой произвольной квадратной двоичной матрицы?

Ответы [ 2 ]

4 голосов
/ 01 июня 2011

Очень простой способ сделать это - использовать функцию НАЙТИ примерно так:

[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
1 голос
/ 01 июня 2011

Если вы знаете, что матрица может быть преобразована в единичную матрицу, почему бы вам просто не создать единичную матрицу с такими же размерами?

identity_matrix=eye(length(Binary))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...