C 高斯消去-线性方程矩阵,算法

C 高斯消去-线性方程矩阵,算法,c,algorithm,matrix,linear-algebra,gaussian,C,Algorithm,Matrix,Linear Algebra,Gaussian,假设我们有一个简单的矩阵3行x 7列。 该矩阵仅包括零(0)和(1),如: 塞纳里奥: 如果我们知道每行中非零的和 (第一行是4,第二行是2,第三行是3。)(蓝线) 另外,如果我们知道每个列的总和(1,0,3,2,2,1,0)(绿线) 另外,如果我们知道从左上到右下(1,0,1,2,3,0,1,1,0)(红线)逆时针方向的每个对角线的总和 最后我们知道从左下角到右上角每个对角线的和(0,0,2,1,3,2,1,0,0)(黄线) 我的问题是: 将这些值作为输入(以及矩阵3x7的长度) 如何绘制第

假设我们有一个简单的矩阵3行x 7列。 该矩阵仅包括零(0)和(1),如:

塞纳里奥: 如果我们知道每行中非零的和

(第一行是4,第二行是2,第三行是3。)(蓝线)

另外,如果我们知道每个列的总和(1,0,3,2,2,1,0)(绿线)

另外,如果我们知道从左上到右下(1,0,1,2,3,0,1,1,0)(红线)逆时针方向的每个对角线的总和

最后我们知道从左下角到右上角每个对角线的和(0,0,2,1,3,2,1,0,0)(黄线)

我的问题是: 将这些值作为输入(以及矩阵3x7的长度)

如何绘制第一个矩阵? 经过深思熟虑,我得出结论,这是一个含有3x7个未知值和一些方程的线性方程组。 对吧?

我怎样才能用C或其他语言来做一个算法来解这些方程呢? 我应该使用像高斯方程这样的方法吗


任何帮助都将不胜感激

从第一列开始。您知道顶部和底部的值(从红色和黄色列表的第一个值)。从绿色列表中的第一个值中减去这两个值的和,现在也得到了中间值

现在往右边走

从红色列表中的下一个值减去第一列的中间值,就得到了第二列的顶部值。从黄色列表中的下一个值减去相同的中间值,就得到了第二列的底部值。从绿色列表中的下一个值中减去这两个值的总和,现在第二列的中间值就出现了

等等

如果您要对其进行编码,您可以看到前两列是一个特例,这将使代码变得丑陋。我建议在左边使用两个全零的“重影”列,这样就可以使用一种方法来确定每列的顶部、底部和中间值

这也很容易概括。您只需使用(#rows)-1个重影列


享受。

作为另一个变体,这个怎么样

Count the amount of unknown squares each sum passes through   
While there are unsolved cells
   Solve all the cells which are passed through by a sum with only one unknown square
       Cells are solved by simply subtracting off all the known cells from the sum
   Update the amount of unknown squares each sum passes through
没有边界情况,但与前面的答案非常相似。这将首先解决所有的角点,然后是与角点相邻的角点,然后是从角点到内部的一步,依此类推


编辑:也可以将所有和为零的路径归零,这些路径应该可以解出任何可解的路径(我认为)

您可以使用奇异值分解来计算矩阵形式的线性齐次(和非齐次)方程组的非零最小二乘解

有关快速概述,请参阅:

首先,你应该把你的系统写成一个矩阵方程,形式为Ax=b,其中x是作为列向量的21个未知数,a是28 x 21矩阵,当相乘时形成线性系统。你基本上需要计算线性方程组的矩阵a,计算a的奇异值分解,并将结果插入方程中,如方程9.17所示

在C中有很多库可以为您计算SVD,所以您只需要公式化矩阵并执行9.17中的计算。最困难的部分可能是理解它是如何工作的,使用库SVD函数所需的代码相对较少

为了让你开始研究线性系统的方程,考虑一个简单的3×3的情况。< /P> 假设我们的系统是一个矩阵的形式

1 0 1
0 1 0
1 0 1
我们将为线性系统提供以下输入:

2 1 2             (sum of rows                 - row)
2 1 2             (sum of colums               - col)
1 0 3 0 1         (sum of first diagonal sets  - t2b)
1 0 3 0 1         (sum of second diagonal sets - b2t)
现在我们为线性系统创建一个矩阵

 A            a1 a2 a3 b1 b2 b3 c1 c2 c3     unknowns (x)    =   result (b)
sum of row 1 [ 1  1  1  0  0  0  0  0  0 ]      [a1]                [2]       
sum of row 2 [ 0  0  0  1  1  1  0  0  0 ]      [a2]                [1]
sum of row 3 [ 0  0  0  0  0  0  1  1  1 ]      [a3]                [2]
sum of col 1 [ 1  0  0  1  0  0  1  0  0 ]      [b1]                [2]
sum of col 2 [ 0  1  0  0  1  0  0  1  0 ]      [b2]                [1]
sum of col 3 [ 0  0  1  0  0  1  0  0  1 ]      [b3]                [2]
sum of t2b 1 [ 1  0  0  0  0  0  0  0  0 ]      [c1]                [1]
sum of t2b 2 [ 0  1  0  1  0  0  0  0  0 ]      [c2]                [0]
sum or t2b 3 [ 0  0  1  0  1  0  1  0  0 ]      [c3]                [3]
sum of t2b 4 [ 0  0  0  0  0  1  0  1  0 ]                          [0]
sum of t2b 5 [ 0  0  0  0  0  0  0  0  1 ]                          [1]
sum of b2t 1 [ 0  0  0  0  0  0  1  0  0 ]                          [1]
sum of b2t 2 [ 0  0  0  1  0  0  0  1  0 ]                          [0]
sum of b2t 3 [ 1  0  0  0  1  0  0  0  1 ]                          [3]
sum of b2t 4 [ 0  1  0  0  0  1  0  0  0 ]                          [0]
sum of b2t 5 [ 0  0  1  0  0  0  0  0  0 ]                          [1]
当你乘以Ax,你会发现你得到了线性方程组。例如,如果将第一行乘以未知列,则得到

a1 + a2 + a3 = 2
你所要做的就是把1放在方程中出现的任何列中,把0放在其他列中

现在你所要做的就是计算A的奇异值分解,并将结果插入方程9.17中,以计算未知量


我推荐SVD,因为它可以有效地计算。如果您愿意,您可以用结果向量b(A | b)扩充矩阵A,并将A放在简化的行梯队形式中以获得结果。

对于10x15个1和0的数组,如果忽略值被限制为1或0,您将尝试查找150个未知数,并得到10+15+2*(10+15-1)=73个等式。很明显,你不能在这个基础上创建一个有唯一解的线性系统

那么,这个约束是否足以给出唯一的解决方案

对于具有以下总和的4x4矩阵,有两种解决方案:

- 1 1 1 1
| 1 1 1 1
\ 0 1 1 0 1 1 0
/ 0 1 1 0 1 1 0

0   0   1   0 
1   0   0   0 
0   0   0   1 
0   1   0   0 

0   1   0   0 
0   0   0   1 
1   0   0   0 
0   0   1   0 
因此,我不希望对更大的矩阵有唯一的解决方案——同样的对称性会存在于许多地方:

- 1 1 0 0 1 1
| 1 1 0 0 1 1
\ 0 1 0 0 1 0 1 0 0 1 0
/ 0 1 0 0 1 0 1 0 0 1 0

0   0   0   0   1   0 
1   0   0   0   0   0 
0   0   0   0   0   0 
0   0   0   0   0   0 
0   0   0   0   0   1 
0   1   0   0   0   0 

0   1   0   0   0   0 
0   0   0   0   0   1 
0   0   0   0   0   0 
0   0   0   0   0   0 
1   0   0   0   0   0 
0   0   0   0   1   0 

在这种特殊情况下,可以将其作为线性方程组求解,因为有21个未知数和超过21个方程。一般来说你不能,因为会有m*n个未知数,只有m+n+2*(m+n-1)个方程。如果我们有一个10x15的数组。我们如何解决它?将它作为一个线性系统来处理,可以消除值为1或0的约束,这意味着对于n>3没有唯一的解决方案。对于一组给定的和,是否有唯一的解决方案取决于你是否能得到两个矩阵的和的相同集合,一个是1,另一个是n*m-10,1在不同的位置,我不认为你能,但需要多想想。你说的“鬼”列是什么意思?如果我们有一个更大的阵列?例如(10x15)…我们如何解决它?它不适用于在两个维度上都大于3的阵列(3是“幸运的”角落案例)。这个解决方案基于这样一个假设:我们可以通过从角点减去值来解构整个列。我的实际数组长度更大。我需要一种通用的方法来进行矩阵运算..也许..解释得很好,但是正如ElKamina指出的,一旦矩阵大于n=3,你就没有足够的方程来计算所有的未知数了
- 1 1 1 1
| 1 1 1 1
\ 0 1 1 0 1 1 0
/ 0 1 1 0 1 1 0

0   0   1   0 
1   0   0   0 
0   0   0   1 
0   1   0   0 

0   1   0   0 
0   0   0   1 
1   0   0   0 
0   0   1   0 
- 1 1 0 0 1 1
| 1 1 0 0 1 1
\ 0 1 0 0 1 0 1 0 0 1 0
/ 0 1 0 0 1 0 1 0 0 1 0

0   0   0   0   1   0 
1   0   0   0   0   0 
0   0   0   0   0   0 
0   0   0   0   0   0 
0   0   0   0   0   1 
0   1   0   0   0   0 

0   1   0   0   0   0 
0   0   0   0   0   1 
0   0   0   0   0   0 
0   0   0   0   0   0 
1   0   0   0   0   0 
0   0   0   0   1   0