我有一个二进制矩阵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,依此类推。你能帮我设计一下这个任务的实现吗?
答案 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;