[心得] 將矩陣調整成blkdiag型式已回收

看板MATLAB作者 (max)時間17年前 (2008/11/27 08:36), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串1/1
看本文前,請先閱讀matlab裡的 blkdiag 指令說明。 原始問題可見12567 矩陣重排, 簡單來說,就是給一矩陣A(不見得是方陣), 矩陣元素非負,每一行與每一列都至少有一元素不為0, 因此可透過列交換與行交換變成 blkdiag型式,叫他C, 依照線性代數的說法, 就是存在E與F(E與F是permutation matrix的乘積) 使得 C=EAF 其中 c1 0 0 ... 0 C= 0 c2 0 ... 0 ..... 0 0 0 ... cn ci不見得是方陣。 我希望有一程式可輸出C, E, F, n 後來為了寫這隻程式,我po了第二文,12620 向量結合, 後來eatrol回文(12626),但我對他的程式舉出反例(12633), 現在我參考eatrol的想法,並作修正,寫了以下的程式來解決最原始問題12567 懇請各位先進給我建議、修正、加快的方法。 function [E,F,C,n]=IBD(A) I=size(A,1); J=size(A,2); for i=1:I; u(i,:)={find(A(i,:)>0)}; end for j=1:J; v(j,:)={(find(A(:,j)>0))'}; end nucount=0; for j=1:I nu(j,:)=u(1,:); u(1,:)=[]; t=1; while t==1 if(size(u,1)==0) break else for i=1:size(u,1) if(size(intersect(nu{j},u{i}),2)>0) nu(j)={union(nu{j},u{i})}; u(i,:)=[]; t=1; break end t=2; end end end nucount=nucount+size(nu{j},2); if(nucount==J) break end end nvcount=0; for j=1:J nv(j,:)=v(1,:); v(1,:)=[]; t=1; while t==1; if(size(v,1)==0) break else for i=1:size(v,1) if(size(intersect(nv{j},v{i}),2)>0) nv(j)={union(nv{j},v{i})}; v(i,:)=[]; t=1; break end t=2; end end end nvcount=nvcount+size(nv{j},2); if(nvcount==I) break end end nuvec=[]; nvvec=[]; n=size(nu,1); for i=1:n nuvec=[nuvec,nu{i}]; nvvec=[nvvec,nv{i}]; end E=eye(I); F=eye(J); E=E(nvvec,:); F=F(:,nuvec); C=E*A*F; -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.109.73.63

11/28 00:14, , 1F
分享推~~~~~
11/28 00:14, 1F
文章代碼(AID): #19BUk3yY (MATLAB)
文章代碼(AID): #19BUk3yY (MATLAB)