《求解关灯游戏》源码分析之三:9*9 矩阵的消元过程
在求解过程中,逆矩阵的获得是个难点。在网上找了些资料,没看明白。而那段代码也不长,索性打印一下日志分析一下。
分析时,数据量当然要小些。2*2 的矩阵,常量矩阵是 4*4 阶,常量矩阵和逆矩阵是相同的。索性就分析一下 3*3 阶的。
分析结果如下:
消元的目的,是将常量矩阵转换成单位矩阵。同时,对一个单位矩阵做相同的操作。这样,
常量矩阵转换成单位矩阵时,单位矩阵就变成了逆矩阵了。
将常量矩阵转换成单位矩阵即,将
110100000
111010000
011001000
100110100
010111010
001011001
000100110
000010111
000001011
转换成
100000000
010000000
001000000
000100000
000010000
000001000
000000100
000000010
000000001
=======================
消元过程
110100000
111010000
011001000
100110100
010111010
001011001
000100110
000010111
000001011
485 i:0 j:0
不换行
消元(将第0列的 1 消去,第0行的不消)
110100000
001110000
011001000
010010100
010111010
001011001
000100110
000010111
000001011
485 i:1 j:2
第一行和第2行进行交换行(目的是让 i=1;j=1 位置的数据变为1)
110100000
011001000
001110000
010010100
010111010
001011001
000100110
000010111
000001011
消元(将第1列的 1 消去,第1行的不消)
101101000
011001000
001110000
001011100
001110010
001011001
000100110
000010111
000001011
485 i:2 j:2
不换行
消元
100011000
010111000
001110000
000101100
000000010
000101001
000100110
000010111
000001011
485 i:3 j:3
不换行
消元
100011000
010010100
001011100
000101100
000000010
000000101
000001010
000010111
000001011
485 i:4 j:7
交换行
100011000
010010100
001011100
000101100
000010111
000000101
000001010
000000010
000001011
消元
100001111
010000011
001001011
000101100
000010111
000000101
000001010
000000010
000001011
485 i:5 j:6
100001111
010000011
001001011
000101100
000010111
000001010
000000101
000000010
000001011
消元
100000101
010000011
001000001
000100110
000010111
000001010
000000101
000000010
000000001
485 i:6 j:6
不换行
消元
100000000
010000011
001000001
000100011
000010010
000001010
000000101
000000010
000000001
485 i:7 j:7
不换行
消元
100000000
010000001
001000001
000100001
000010000
000001000
000000101
000000010
000000001
485 i:8 j:8
不换行
消元
100000000
010000000
001000000
000100000
000010000
000001000
000000100
000000010
000000001
在求解过程中,逆矩阵的获得是个难点。在网上找了些资料,没看明白。而那段代码也不长,索性打印一下日志分析一下。
分析时,数据量当然要小些。2*2 的矩阵,常量矩阵是 4*4 阶,常量矩阵和逆矩阵是相同的。索性就分析一下 3*3 阶的。
分析结果如下:
消元的目的,是将常量矩阵转换成单位矩阵。同时,对一个单位矩阵做相同的操作。这样,
常量矩阵转换成单位矩阵时,单位矩阵就变成了逆矩阵了。
将常量矩阵转换成单位矩阵即,将
110100000
111010000
011001000
100110100
010111010
001011001
000100110
000010111
000001011
转换成
100000000
010000000
001000000
000100000
000010000
000001000
000000100
000000010
000000001
=======================
消元过程
110100000
111010000
011001000
100110100
010111010
001011001
000100110
000010111
000001011
485 i:0 j:0
不换行
消元(将第0列的 1 消去,第0行的不消)
110100000
001110000
011001000
010010100
010111010
001011001
000100110
000010111
000001011
485 i:1 j:2
第一行和第2行进行交换行(目的是让 i=1;j=1 位置的数据变为1)
110100000
011001000
001110000
010010100
010111010
001011001
000100110
000010111
000001011
消元(将第1列的 1 消去,第1行的不消)
101101000
011001000
001110000
001011100
001110010
001011001
000100110
000010111
000001011
485 i:2 j:2
不换行
消元
100011000
010111000
001110000
000101100
000000010
000101001
000100110
000010111
000001011
485 i:3 j:3
不换行
消元
100011000
010010100
001011100
000101100
000000010
000000101
000001010
000010111
000001011
485 i:4 j:7
交换行
100011000
010010100
001011100
000101100
000010111
000000101
000001010
000000010
000001011
消元
100001111
010000011
001001011
000101100
000010111
000000101
000001010
000000010
000001011
485 i:5 j:6
100001111
010000011
001001011
000101100
000010111
000001010
000000101
000000010
000001011
消元
100000101
010000011
001000001
000100110
000010111
000001010
000000101
000000010
000000001
485 i:6 j:6
不换行
消元
100000000
010000011
001000001
000100011
000010010
000001010
000000101
000000010
000000001
485 i:7 j:7
不换行
消元
100000000
010000001
001000001
000100001
000010000
000001000
000000101
000000010
000000001
485 i:8 j:8
不换行
消元
100000000
010000000
001000000
000100000
000010000
000001000
000000100
000000010
000000001