前言及实现
本文说的对角最大化不是传统意义上的"对角占优"!更像是一级一级分解下的对角最大化。多说无益,描述一个例子即可明白:
有这样一个矩阵:
都一步:找出所有元素中绝对值最大的,是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个,也就是最后那个对角元素。