前言及實現
本文說的對角最大化不是傳統意義上的"對角占優"!更像是一級一級分解下的對角最大化。多說無益,描述一個例子即可明白:
有這樣一個矩陣:
都一步:找出所有元素中絕對值最大的,是11,它在(2,4)的位置。把11換到的位置:第1行與第2行交換,第1列與第4列交換。得到:
第二步:第一對角元素最大化搞定后,不再看第1行和第1列(從視線上劃去),從剩下的第2行第2列及以后看起。重復第一步操作:找到絕對值最大的是10(有重復就選最后一個),它在(3,4)。把10換到的位置:第2行與第3行換,第2列與第4列換。得到:
第三步:同理,從第3行第3列及以后看起。絕對值最大的是8,它在(4,3)。把8換到的位置:第3行與第4行換,第3列與第3列換(只是為了保持操作一致而已,好編程)。得到:
還剩最后一個,就不動了。示例的操作就此結束。下面用matlab編程實現一下:
A = [10 -1 2 0;-1 3 -1 11;10 -1 2 -1;0 3 8 -1];
% 獲取系數矩陣的尺寸
[row,col] = size(A);
flag = 1;
while 1
Atmp = abs(A); % 對Atmp的搜索范圍隨著flag增大而減小
[maxrow,maxcol] = find( Atmp == max(max(Atmp(flag:row,flag:col))) ); % 絕對值最大值坐標
maxrow = maxrow(end);
maxcol = maxcol(end); % 會有多個相同最大值的情況, 統一取最后一個
% 換行:
A([flag maxrow],:) = A([maxrow flag],:)
% 換列:
A(:,[flag maxcol]) = A(:,[maxcol,flag])
flag = flag + 1;
if flag > row-1
break;
end
end
A
效果:
A =
11 -1 -1 3
-1 10 2 -1
-1 0 8 3
0 10 2 -1
有2點需要注意:
最終結果不一定是對角占優的:因為每次劃去(不看)的行和列中有可能比考察范圍內元素絕對值都大的情況!如例子最終的第4行:10 > -1
最終結果不一定是對角都是非0元素:很好想象!舉一個例子:
這個矩陣調完之后還是它本身,所以最后面那個對角元素還是0!但是:如果原矩陣不是稀疏矩陣,那對角0元素最多出現1個,也就是最后那個對角元素。