matlab矩陣對角最大化實現

前言及實現

本文說的對角最大化不是傳統意義上的"對角占優"!更像是一級一級分解下的對角最大化。多說無益,描述一個例子即可明白:

有這樣一個矩陣:

\left( \begin{matrix} 10 & -1 & 2 & 0 \\ -1 & 3 & -1 & 11 \\ 10 & -1 & 2 & -1 \\ 0 & 3 & 8 & -1 \end{matrix} \right)

都一步:找出所有元素中絕對值最大的,是11,它在(2,4)的位置。把11換到a_{11}的位置:第1行與第2行交換,第1列與第4列交換。得到:

\left( \begin{matrix} \color{red}{11} & 3 & -1 & -1 \\ 0 & -1 & 2 & 10 \\ -1 & -1 & 2 & 10 \\ -1 & 3 & 8 & 0 \end{matrix} \right)

第二步:第一對角元素最大化搞定后,不再看第1行和第1列(從視線上劃去),從剩下第2行第2列及以后看起。重復第一步操作:找到絕對值最大的是10(有重復就選最后一個),它在(3,4)。把10換到a_{22}的位置:第2行與第3行換,第2列與第4列換。得到:

\left( \begin{matrix} \color{red}{11} & -1 & -1 & 3 \\ -1 & \color{red}{10}& 2 & -1 \\ 0 & 10 & 2 & -1 \\ -1 & 0 & 8 & 3 \end{matrix} \right)

第三步:同理,從第3行第3列及以后看起。絕對值最大的是8,它在(4,3)。把8換到a_{33}的位置:第3行與第4行換,第3列與第3列換(只是為了保持操作一致而已,好編程)。得到:

\left( \begin{matrix} \color{red}{11} & -1 & -1 & 3 \\ -1 & \color{red}{10}& 2 & -1 \\ -1 & 0 & \color{red}{8} & 3 \\ 0 & 10 & 2 & -1 \end{matrix} \right)

還剩最后一個,就不動了。示例的操作就此結束。下面用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元素:很好想象!舉一個例子:

\left( \begin{matrix} 11 & 0 & 3 \\ 5 & 8 & -4 \\ 2 & 7 & \color{red}{0} \end{matrix} \right)

這個矩陣調完之后還是它本身,所以最后面那個對角元素還是0!但是:如果原矩陣不是稀疏矩陣,那對角0元素最多出現1個,也就是最后那個對角元素。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容