如何重新排序二进制矩阵,使列中至少有“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”值的主要内容,如果未能解决你的问题,请参考以下文章