Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 二元(0-1)矩阵的双字典排序_Matlab_Sorting_Matrix_Graph Algorithm_Lexicographic - Fatal编程技术网

Matlab 二元(0-1)矩阵的双字典排序

Matlab 二元(0-1)矩阵的双字典排序,matlab,sorting,matrix,graph-algorithm,lexicographic,Matlab,Sorting,Matrix,Graph Algorithm,Lexicographic,我想对二进制矩阵进行排序,通过切换行和列,使其列和行都按字典顺序排列。换句话说,我需要对由0和1组成的矩阵进行双词法排序,而所有行和列的条目都保留在各自的行/列中。这将在不中断列/行的情况下,用尽可能多的1s有效地填充结果矩阵的右下侧。(在我的例子中,我需要填充左上角,因此我只需翻转结果。) 有人能给我提供一个链接到做这件事的代码吗?如果该算法适用于任何维度的张量,将是一个非常值得赞赏的奖励 我首先尝试按字典顺序对所有行进行排序,然后对所有列进行排序,重复此操作,直到获得的矩阵不再发生变化。我将

我想对二进制矩阵进行排序,通过切换行和列,使其列和行都按字典顺序排列。换句话说,我需要对由0和1组成的矩阵进行双词法排序,而所有行和列的条目都保留在各自的行/列中。这将在不中断列/行的情况下,用尽可能多的
1
s有效地填充结果矩阵的右下侧。(在我的例子中,我需要填充左上角,因此我只需翻转结果。)

有人能给我提供一个链接到做这件事的代码吗?如果该算法适用于任何维度的张量,将是一个非常值得赞赏的奖励

我首先尝试按字典顺序对所有行进行排序,然后对所有列进行排序,重复此操作,直到获得的矩阵不再发生变化。我将其与第一次对列进行排序进行了比较,并使用了更好的结果。然而,这个结果似乎陷入了某种局部最优,并没有产生最好的结果。因此,我寻找现有的算法,但没有发现任何实现和快速可用的算法

我找到了一个旧的 [1] 这正是在O(mn)中实现的,但在实现它时遇到了困难。也许有人能帮我写代码,尤其是

  • 指针
    ,用于跟踪在调用
    dlrefine
    时尚未拆分的列块
  • 使用
    bucket
    填充时,有时可能会失败
[1] :Spinrad,Jeremy p.“密集0–1矩阵的双词汇排序”,《信息处理快报》45.5(1993):229-235

以下是我的实现尝试中错误的Matlab代码:

函数[A,I]=dlpartition(M)
路由={};
RP={1:size(M,1)};
Rlast=1;
CP={1:size(M,2)};
指针=一(1,大小(M,1));
而Rlast>0
R=RP{Rlast};
C=[];
如果有(指针(R)>0)
碎屑=指针(R);
碎屑=min(碎屑(碎屑>0));
C=CP{碎屑};%未经R检查的最后一个列块
结束
如果是空的(C)
Rlast=Rlast-1;
溃败=[R溃败];
其他的
[R,C,指针]=dlrefine(M,R,C,指针C+1);
指针=指针+碎屑-1;
RP=[RP{1:Rlast-1}R RP{Rlast+1:end}];
Rlast=Rlast-1+长度(R);
CP=[CP{1:Clast-1}CP{Clast+1:end}];
结束
结束
%准备输出以满足我的需要
I=重塑(1:numel(M),尺寸(M));
I=I(翻转([Rout{:}]),:);
I=I(:,flip([CP{:}]);
A=M(I);
结束
函数[R,C,指针]=dlrefine(M,R,C,指针)
%斯宾拉德1992
%M二进制矩阵进行排序
%R当前块中的行数组
%当前块中的C列数组
%指针从所有行到
%尚未被其拆分的列块
%具有偏移量,因此1是当前值
%C区
C={C};
对于r=r
c=长度(c);
C2=[];
如果指针(r)>=c%,则Cc未被r拆分
而i空(C2)和&c>0
C1=相交(C{C},求(M(r,:));
C2=setdiff(C{C},C1);
如果~isempty(C1)&&~isempty(C2)
C={C{1:C-1}c2c1c{C+1:end};
指针=指针+(指针>=c);
%指针(r)=c-1;%测试(通常未注释)
结束
%如果为空(C2)%测试(通常未注释)
c=c-1;
%结束%测试(通常未注释)
结束
指针(r)=c;%测试(通常注释掉)
结束
结束
桶=单元(1,长度(C));
失败=[];
对于r=r
成功=错误;
对于分段=长度(C):-1:1
如果有(ismember(C{sub},find(1-M(r,:)))
bucket{sub}=[bucket{sub}r];
成功=真实;
打破
结束
结束
如果成功
失败=[failed r];
结束
结束
R=铲斗(端部:-1:1);
R=[R(~cellfun('isempty',R))失败];
结束
为方便起见,您可以使用本文中使用的相同矩阵运行
dlpartition
函数:

M=[0110;
1 0 1 1 1 0;
0 1 1 1 1 0;
1 1 0 0 0 1;
0 1 0 1 0 1;
1 0 0 1 1 1];
[ai]=dli分区(M)
编辑: 该代码适用于本文中给出的小示例,并生成:

A =  1 1 1 1 0 0
     1 1 1 0 0 0
     1 1 0 1 1 0
     1 1 0 0 1 1
     1 0 1 0 0 1
     0 0 1 0 1 1
但它不能生成任意矩阵的全局最优解。例如:

M=[1 0 1 0 0
   1 1 0 0 1
   1 0 0 0 1
   0 0 1 1 1
   0 0 1 0 1];
[A I]=dlpartition(M)
%this gives            but should give
%A = 1 1 0 0 0         1 1 1 0 0
%    1 0 1 1 0         1 1 0 0 0
%    1 0 1 0 0         1 0 0 1 0
%    0 1 1 0 1         0 1 0 1 1
%    0 1 1 0 0         0 1 0 1 0