如何重新排序二进制矩阵,使列

时间:2016-01-15 13:14:18

标签: algorithm matlab

我有一个二进制矩阵A作为

A=[0 0 0 1
   0 1 1 0;
   0 1 0 1;
   0 0 0 1;
   0 1 1 1]

我想重新排序矩阵A,使至少1列具有'1'值。所以,矩阵A将来

%% switch first col and last col in the first row
A=[1 0 0 0
   0 1 1 0;
   0 1 0 1;
   0 0 0 1;
   0 1 1 1]

现在,A满足了上述条件。是否可以在MATLAB中实现它?谢谢所有

第二个例子

A=[1 0 0 1;
   0 0 1 1;
   0 0 0 1]

然后结果是

A=[1 0 0 1;
   0 1 1 0;  %% second and fourth col is switched
   0 0 0 1]

更新:如果A的行正在进行中会发生什么。这意味着在t = 0时,第一行到来,A = [1 0 0 1]。然后下一次,第二排来了。矩阵A将是A = [1 0 0 1; 0 0 1 1]。然后算法将在这里检查,因为第二个col。 A是零。执行切换,然后执行A的下一个col,依此类推。你能帮我设计一下这个任务的实现吗?

3 个答案:

答案 0 :(得分:1)

我想这会(至少对于高大的矩阵)

AppSingleton.sPointsLookupMap.get(pointsKey)

答案 1 :(得分:1)

我找到了最愚蠢的方法:D

A=[0 0 0 1
   0 1 1 0;
   0 1 0 1;
   0 0 0 1;
   0 1 1 1];
while ~(any(A(:,1)) && any(A(:,2)) && any(A(:,3)) && any(A(:,4)))
    for ii = 1:length(A(:,1))
        A(ii,:) = A(ii,randperm(4,4));
    end
end
disp(A)

代码会检查A中的每一列是否有1。如果没有,它会随机移动A中的行并重复,直到满足要求为止。

答案 2 :(得分:1)

简单的确定性策略,从左上角开始,尽可能多地填充第一行的列,然后继续下一行和下一列。对于剩余的行,只需从第一列开始。

%Get rows in which ones can be found.
[~,r]=find(A.');
%Assign new column values for the ones
c=mod(0:numel(r)-1,size(A,2))+1;
B=zeros(size(A));
B(sub2ind(size(A),r(:),c(:)))=1;