[心得] 將矩陣調整成blkdiag型式已回收
看本文前,請先閱讀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
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章