给定一个二进制矩阵,其中每一行和每列只包含一个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
。
如何为任何给定的任意方二进制矩阵优化重排列?
答案 0 :(得分:4)
一种非常简单的方法是使用函数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
OLD APPROACH:
这不像上面的解决方案那样紧凑或高效,但您也可以转置矩阵并使用SORTROWS对列进行排序(现在转换为行)并返回排序索引。这实际上会按升序对值进行排序,这将为您提供反对角矩阵,因此您需要使用FLIPUD来翻转索引向量。这是代码:
[~,index] = sortrows(Binary.'); %'# Transpose and sort the matrix
index = flipud(index); %# Flip the index vector
答案 1 :(得分:1)
如果您知道矩阵可以被操作为单位矩阵,为什么不创建具有相同维度的单位矩阵?
identity_matrix=eye(length(Binary))