如何重新排序二进制矩阵,使列中至少有“1”值

Posted

技术标签:

【中文标题】如何重新排序二进制矩阵,使列中至少有“1”值【英文标题】:How to reorder a binary matrix such that at least '1' value in the column 【发布时间】:2016-01-15 13:14:17 【问题描述】:

我有一个二进制矩阵 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]。然后算法将在这里检查,因为第二列。 A 的值为零。执行切换,然后 A 的下一个列出现,依此类推。你能帮我设计这个任务吗?

【问题讨论】:

排序只在列中完成? 是的。每个列中必须有 1 个值。 让我澄清一下。订购允许的操作有哪些 我认为它只是切换操作。这意味着在 col 或 row 之间切换以使 A 的每个 col 至少具有 1 个值。 你能详细说明一下编辑吗? 【参考方案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;

【讨论】:

谢谢丹尼尔。但我认为 0:numel(c) 必须是 0:numel(r)。我想你打错了那行。请参阅我关于 col 的更新问题。飞行中的一个 你说得对,我的代码中最初是 [c,r]=find(A.');,但为了避免混淆而将其删除。【参考方案2】:

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

for ind = 1:min(size(A))
    t = A(ind,:);
    A(ind,:) = circshift(t,[0 -(find(t)-ind)]);
end

【讨论】:

【参考方案3】:

我找到了最愚蠢的方法: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 中的行并重复,直到满足要求为止。

【讨论】:

以上是关于如何重新排序二进制矩阵,使列中至少有“1”值的主要内容,如果未能解决你的问题,请参考以下文章

Numpy - 如何根据其他列中的二进制值计算列中的值?

excel:根据另一列中的顺序对十进制值列表进行排序

当表达式显示时打印静态文本如果细节带中至少有一个非空字段

重复计算两个值之间的距离 Excel

如何使列中的条目显示为行标题

01矩阵-BFS