matlab对角替换,matlab矩阵对角最大化实现

前言及实现

本文说的对角最大化不是传统意义上的"对角占优"!更像是一级一级分解下的对角最大化。多说无益,描述一个例子即可明白:

有这样一个矩阵:

math?formula=%5Cleft(%20%5Cbegin%7Bmatrix%7D%2010%20%26%20-1%20%26%202%20%26%200%20%5C%5C%20-1%20%26%203%20%26%20-1%20%26%2011%20%5C%5C%2010%20%26%20-1%20%26%202%20%26%20-1%20%5C%5C%200%20%26%203%20%26%208%20%26%20-1%20%5Cend%7Bmatrix%7D%20%5Cright)

都一步:找出所有元素中绝对值最大的,是11,它在(2,4)的位置。把11换到

math?formula=a_%7B11%7D的位置:第1行与第2行交换,第1列与第4列交换。得到:

math?formula=%5Cleft(%20%5Cbegin%7Bmatrix%7D%20%5Ccolor%7Bred%7D%7B11%7D%20%26%203%20%26%20-1%20%26%20-1%20%5C%5C%200%20%26%20-1%20%26%202%20%26%2010%20%5C%5C%20-1%20%26%20-1%20%26%202%20%26%2010%20%5C%5C%20-1%20%26%203%20%26%208%20%26%200%20%5Cend%7Bmatrix%7D%20%5Cright)

第二步:第一对角元素最大化搞定后,不再看第1行和第1列(从视线上划去),从剩下的第2行第2列及以后看起。重复第一步操作:找到绝对值最大的是10(有重复就选最后一个),它在(3,4)。把10换到

math?formula=a_%7B22%7D的位置:第2行与第3行换,第2列与第4列换。得到:

math?formula=%5Cleft(%20%5Cbegin%7Bmatrix%7D%20%5Ccolor%7Bred%7D%7B11%7D%20%26%20-1%20%26%20-1%20%26%203%20%5C%5C%20-1%20%26%20%5Ccolor%7Bred%7D%7B10%7D%26%202%20%26%20-1%20%5C%5C%200%20%26%2010%20%26%202%20%26%20-1%20%5C%5C%20-1%20%26%200%20%26%208%20%26%203%20%5Cend%7Bmatrix%7D%20%5Cright)

第三步:同理,从第3行第3列及以后看起。绝对值最大的是8,它在(4,3)。把8换到

math?formula=a_%7B33%7D的位置:第3行与第4行换,第3列与第3列换(只是为了保持操作一致而已,好编程)。得到:

math?formula=%5Cleft(%20%5Cbegin%7Bmatrix%7D%20%5Ccolor%7Bred%7D%7B11%7D%20%26%20-1%20%26%20-1%20%26%203%20%5C%5C%20-1%20%26%20%5Ccolor%7Bred%7D%7B10%7D%26%202%20%26%20-1%20%5C%5C%20-1%20%26%200%20%26%20%5Ccolor%7Bred%7D%7B8%7D%20%26%203%20%5C%5C%200%20%26%2010%20%26%202%20%26%20-1%20%5Cend%7Bmatrix%7D%20%5Cright)

还剩最后一个,就不动了。示例的操作就此结束。下面用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元素:很好想象!举一个例子:

math?formula=%5Cleft(%20%5Cbegin%7Bmatrix%7D%2011%20%26%200%20%26%203%20%5C%5C%205%20%26%208%20%26%20-4%20%5C%5C%202%20%26%207%20%26%20%5Ccolor%7Bred%7D%7B0%7D%20%5Cend%7Bmatrix%7D%20%5Cright)

这个矩阵调完之后还是它本身,所以最后面那个对角元素还是0!但是:如果原矩阵不是稀疏矩阵,那对角0元素最多出现1个,也就是最后那个对角元素。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值