C++ 矩阵求解中的高斯消去问题
//这样称呼。。。C++ 矩阵求解中的高斯消去问题,c++,gaussian,C++,Gaussian,//这样称呼。。。 solveMatrix(aMatrix、bMatrix、actualCol) float*solveMatrix(float aMatrix[][DEFCOLS+1],float bMatrix[DEFCOLS],size\t cols){ std::cout我不确定所有的问题是什么,但一个明显的问题是您的outMatrix。您返回一个指向本地数组的指针。该数组在函数结束时被销毁。您返回的指针现在是垃圾 更改此行: float* solveMatrix(float aMatr
solveMatrix(aMatrix、bMatrix、actualCol)代码>
float*solveMatrix(float aMatrix[][DEFCOLS+1],float bMatrix[DEFCOLS],size\t cols){
std::cout我不确定所有的问题是什么,但一个明显的问题是您的outMatrix
。您返回一个指向本地数组的指针。该数组在函数结束时被销毁。您返回的指针现在是垃圾
更改此行:
float* solveMatrix(float aMatrix[][DEFCOLS+1],float bMatrix[DEFCOLS], size_t cols){
std::cout << "\nInside solveMatrix...: " << endl;
size_t N2 = cols;
std::cout << "\N2 is...: " << N2 << endl;
for(size_t p=0; p<N2; p++){
//std::cout << "\nInside 1st for loop...: " << endl;
// find pivot row and swap
int max = p;
for(size_t i=p+1; i<N2; i++){
//std::cout << "\nInside 2nd for loop...: " << endl;
if ( abs(aMatrix[i][p]) > abs(aMatrix[max][p]) ){
max = i;
}
}
//std::cout << "\nJust b4 all the swapping...: " << endl;
float temp[] = { *aMatrix[p] };
*aMatrix[p] = *aMatrix[max];
*aMatrix[max] = *temp;
float t = bMatrix[p];
bMatrix[p] = bMatrix[max];
bMatrix[max] = t;
//std::cout << "\nDone all the swapping...: " << endl;
if ( abs(aMatrix[p][p]) <= MINISCULE) {
//std::cout << "***** Error matrix value too small. Matrix is singular" << endl;
//exit;
}
//std::cout << "\nJust the pivoting...: " << endl;
// Pivot /in A and b
for(size_t i=p+1; i<N2; i++){
//std::cout << "\nInside the 1st pivoting loop...: " << endl;
//std::cout << "\nAbout to do the [aMatrix[p][p]] division in back subst..: " << endl;
float alpha = aMatrix[i][p] / aMatrix[p][p];
bMatrix[i] = alpha * bMatrix[p];
for(size_t j=p; j<N2; j++){
//std::cout << "\nInside the 2nd pivoting loop...: " << endl;
aMatrix[i][j] -= alpha * aMatrix[p][j];
}
}
std::cout << "\nAbout to do the back subst..: " << endl;
// back subst.
float outMatrix[DEFROWS] = {0.0};
for(size_t i=N2-1; i>=0; i--){
std::cout << "\nInside the 1st back subst for loop..: " << endl;
float sum = 0.0;
for(size_t j=i+1; j<N2; j++){
std::cout << "\nInside the 2nd back subst for loop..: " << endl;
sum += aMatrix[i][j] * outMatrix[j];
}
std::cout << "\nAbout to do the [aMatrix[i][i]] division in back subst..: " << endl;
std::cout << "\n*outMatrix[i]: " << outMatrix[i] << endl;
std::cout << "\n( bMatrix[i] - sum ) : " << ( bMatrix[i] - sum ) << endl;
std::cout << "\n****aMatrix[i][i] : " << aMatrix[i][i] << endl;
if (aMatrix[i][i] > 0){
std::cout << "\nDid the division [aMatrix[i][i]] > 0 division in back subst..: " << endl;
std::cout << "\n*outMatrix[i]: " << outMatrix[i] << endl;
std::cout << "\n( bMatrix[i] - sum ) : " << ( bMatrix[i] - sum ) << endl;
std::cout << "\naMatrix[i][i] : " << aMatrix[i][i] << endl;
outMatrix[i] = ( bMatrix[i] - sum ) / aMatrix[i][i];
std::cout << "\nDid the division [aMatrix[i][i]] > 0 division in back subst..DONE: " << endl;
}else {
std::cout << "\nDid the divirion [aMatrix[i][i]] = 0 division in back subst..: " << endl;
outMatrix[i] = 0.0;
std::cout << "\nDid the divirion [aMatrix[i][i]] = 0 division in back subst..DONE: " << endl;
}
std::cout << "\nDid the [aMatrix[i][i]] division in back subst..: " << endl;
}
std::cout << "\nLeft the back subst for loops..: " << endl;
return outMatrix;
}
} // end solveMatrix()
致:
然后你需要把它归零
<强>注:如果使用<代码>向量,最好是返回,但是你用原始指针写了它,所以我用原始指针回答。原始指针导致内存泄漏。在可能的时候应该避免使用C++。很少有必要分配一个原始指针。< /P>
编辑:
看
EDIT2:改为使用vector,如果编译器支持C++11标准中定义的移动运算符和构造函数,那么返回向量是一种廉价的操作
float* outMatrix = new float[DEFROWS];
std::vector solveMatrix(/*您的参数*/)
{
标准::向量输出矩阵(定义,0.0);
//你的代码
返回矩阵;
}
显然,您无法从剪贴工具粘贴。请将图像保存在磁盘上,然后选择“插入图像”>“从计算机”>“浏览”请考虑使用LAPACK。“深黄色:在大多数情况下,如果你正在做一个全面的数值模拟,我同意。但是如果你想了解这一点,或者如果你需要一个真正的特殊情况,我会不同意。LAPACK对于一个小项目来说可能有点大。”MikeBantegui:因此,“考虑”一词。注释,OP没有处理特殊情况,他正在进行一般性求解。你会担心足迹吗?静态链接的LAPACK可以非常紧凑。它也会比OP的代码更有效,因为使用适当的BLAS(例如MKL)它将针对包括多线程在内的硬件进行高度优化。我采纳了你的建议,使用了向量,而不是矩阵,情况看起来好了一点,但是在声明向量后,程序不会进入第二个for循环。我通过调试器运行了它,我注意到I,j变量总是一些大的变量er 8位,即使我将它们初始化为0???任何想法都会有帮助-谢谢。@MichealNoel-传入的cols
的值是多少。您可以在函数顶部设置N2=cols
。然后设置I=N2
和j=I+1
。如果N2被设置为垃圾值,则可能会出现这些问题@MichealNoel-有什么更新吗?我不确定您对DEFROWS
和DEFCOLS
使用了什么值,也不确定您将什么值传递给cols
的方法,我可以通过这些值了解您的情况,然后提出其他改进建议。
float outMatrix[DEFROWS] = {0.0};
float* outMatrix = new float[DEFROWS];
std::vector<float> solveMatrix(/* Your arguments */)
{
std::vector<float> outMatrix(DEFROWS, 0.0);
// Your code
return outMatrix;
}