我为高斯矩阵制作了这段代码,但代码有问题,我不知道如何解决它。高斯矩阵没有显示应该是什么。我使用[[0,0,1,2],[2,3,0,-2],[3,3,6,-9]]作为矩阵A,它排序很好但是当涉及到高斯时我得到[[3.0,3.0,6.0,-9.0],[3.0,5.25,-3.0,0.0],[0,0,1.0,2.0]],当正确的答案是[[3.0,3.0,6.0, - 9.0],[0.0,-1.5,6.0,-6.0],[0,0,1.0,2.0]。有人能告诉我我做错了什么吗?谢谢你提前。
public static double[][] sortMatrix(double[][] matrix)
{
int m=matrix.length;
int n=matrix[0].length;
double[] temp=new double[n];
int a=0;
for(int fixedCol=a;fixedCol<n;fixedCol++)//Working and fixing the column only.
{
for(int fixedRow=a;fixedRow<m;fixedRow++)//First process.
{
//Second process.
for(int i=fixedRow;i<m;i++)//Checking if the column element is bigger.
{
if(matrix[fixedRow][fixedCol]<matrix[i][fixedCol])
{
for(int j=0;j<n;j++)
{
temp[j]=matrix[fixedRow][j];
matrix[fixedRow][j]=matrix[i][j];
matrix[i][j]=temp[j];//Until now, changes the row and since fixed row and column points to a value, nothing to change.
}
}
}//End of second process.
}
for(int fixedRow=a;fixedRow<m;fixedRow++)
{
if(matrix[fixedRow][fixedCol]!=0)
{
a=a+1;
}
else
{
break;
}
}
}//End of first process
return matrix;
}
//Gauss Matrix
public static double[][] gauss(double[][] matrix)
{
double tempPrincipal,tempSecondary;
int m=matrix.length;
int n=matrix[0].length;
sortMatrix(matrix);
for(int fixedRowPrincipal=0;fixedRowPrincipal<(m-1);fixedRowPrincipal++)
{
for(int fixedColPrincipal=0;fixedColPrincipal<n;fixedColPrincipal++)//First process: Finding the first element different from 0.
{
if(matrix[fixedRowPrincipal][fixedColPrincipal]!=0)//Found the first element different from 0.
{
if(matrix[fixedRowPrincipal+1][fixedColPrincipal]!=0)//Conditioning the element below isn´t 0.
{
tempPrincipal=matrix[fixedRowPrincipal][fixedColPrincipal];//Assigning fixed values for the elements.
tempSecondary=matrix[fixedRowPrincipal+1][fixedColPrincipal];
for(int j=(fixedColPrincipal);j<n;j++)
{
if(tempPrincipal<0)
{
if(tempSecondary<0)
{
matrix[fixedRowPrincipal+1][j]=matrix[fixedRowPrincipal][j]+(-1.0)*matrix[fixedRowPrincipal+1][j]*(tempPrincipal/tempSecondary);
}
else
{
matrix[fixedRowPrincipal+1][j]=matrix[fixedRowPrincipal][j]+(1.0)*matrix[fixedRowPrincipal+1][j]*(tempPrincipal/tempSecondary);
}
}
else
{
if(tempSecondary<0)
{
matrix[fixedRowPrincipal+1][j]=matrix[fixedRowPrincipal][j]+(1.0)*matrix[fixedRowPrincipal+1][j]*(tempPrincipal/tempSecondary);
}
else
{
matrix[fixedRowPrincipal+1][j]=matrix[fixedRowPrincipal][j]-(matrix[fixedRowPrincipal+1][j]/tempSecondary)*tempPrincipal;
}
}
matrix[fixedRowPrincipal+1][j]=matrix[fixedRowPrincipal][j]+(-1)*matrix[fixedRowPrincipal+1][j]*(tempPrincipal/tempSecondary);
}
sortMatrix(matrix);
fixedRowPrincipal=0;
break;
}
else
{
break;
}
}
}
}
return matrix;
}
答案 0 :(得分:0)
Gussian Reduction是关于Row操作的,所以最好先实现它们。为此我们只需要一个带矩阵的函数,Ri和Rj和a,它将一个* Ri添加到Rj。
其他Row操作是:切换两行并将一个行乘以一个数字,我将解释为什么我们在这里不需要它们:)。
现在我们要确定“pivot元素”,假设矩阵A
的大小为n * m,在第一次迭代时,pivot元素是A [0] [0],在第二次迭代时它是A [1] [1]。
简而言之,它是A[i][i]
。
现在我们要更改i
之后的每一行,以便每个A[r][i]
i+1<=r<n
为零
我们更改行r
以便A[r]+=(-A[r][i]/A[i][i])*A[i]
,我们可以从第1步调用该函数来执行此操作。
我们为每i<n-1 && i<m
重复第二步和第三步,我们就完成了。
变量i
应小于n-1
而不是n,因为我们想要更改r
或更多行i+1
,行i=n-1
之后没有任何行。
它应该小于m
,因为我们也将它用作列号。
其他用于制作枢轴元素1
,因为1对于人类来说更简单。
但计算机没有1号以外的数字问题,实际上试图使它1
会损害性能,因为它需要额外的计算(特别是切换行)。
在第3步中,我们有A[r]+=(-A[r][i]/A[i][i])*A[i]
,即使A[r][i]
已经为零,这也会有效,但由于之前的等式是通过具有O(n)
复杂度的函数调用实现的,因此我们可以避免调用完全通过检查A[r][i]
是否为零,如果是continue
第四步中的循环(我们也可以在执行此操作的函数内进行检查,这在我看来更好)。
我将为您留下实施,我建议使用此签名的第一步功能:
void addRowToRow(double[][] a,int i,int j,int alpha)
应该在步骤3中调用它:
addRowToRow(a,i,r,-(a[r][i]/a[i][i]));
我认为你只需要高斯减少并且你不需要方程求解器,无论如何,前面的步骤可以是方程求解器可以调用的reduce(double[][] a)
函数。