C++ 矩阵 Determinant/Memory 分配
C++ Matrix Determinant/Memory Allocation
我正在尝试用 C++ 编写矩阵行列式函数。但是我的代码无法编译,也不知道为什么(我使用的是在线 C++ 编译器,iget 的错误消息是“* Error in `/var/www/service/usercode/519646917/a.out': free( ): 下一个大小无效(快速):0x00000000019c1180 * " )。看来问题出在Free函数上。
谁能告诉我我的代码有什么问题吗?
提前致谢
问候
#include <iostream>
#include <cmath>
#include <fstream>
#include <vector>
#include <numeric>
#include <iterator>
#include <map>
#include <string>
//C++ clang
using namespace std;
void Free(double** a, unsigned int n)
{
if (a!=NULL)
{
for (unsigned int j=0 ; j<n ; j++)
{
delete[] a[j];
}
delete[] a;
}
}
double mDeterminant(double** a, unsigned int n)
{
if (n==1)
{
return a[0][0];
}
else if(n==2)
{
return a[0][0]*a[1][1]-a[0][1]*a[1][0];
}
else
{
double res=0.0;
for (unsigned int i=0 ; i<n ; i++)
{
double** A=new double*[n-1];
for (unsigned int j=0 ; j<n-1 ; j++)
{
A[j]=new double[n-1];
}
for (unsigned int j=1 ; j<n ; j++)
{
unsigned int g=0;
for (unsigned int k=0 ; k<n ; k++)
{
if (k!=i)
{
A[j-1][g]=a[j][k]; g++;
}
}
}
res+=a[0][i]*pow(-1, i)*mDeterminant(A, n-1);
Free(A,n-1);
}
return res;
}
}
int main()
{
unsigned int N=4;
double** a=new double*[N];
for (unsigned int i=0 ; i<N ; i++)
{
a[i]=new double[N];
}
for (unsigned int i=0 ; i < N ; i++)
{
for (unsigned int j=0 ; j < N ; j++)
{
a[i][j]=(1+i)*(2+j-i);
cout << a[i][j] << ";";
}
cout << endl;
}
cout << "----------------------------------" << endl;
cout << "mDeterminant = " << mDeterminant(a, N) << endl;
}
您的错误太多:
a[i]=new double;
应该是 a[i]=new double[N];
。
double** A=new double*[n-1];
应该是 double** A=new double*[n];
或者下面的循环应该是直到 n-1。
A[j]=new double[n-1];
应该是 A[j]=new double[n];
或者下面的循环应该是直到 n-1。
这里 A[j-1][g]=a[j][k]; g++;
你的 g
超出了数组范围。您也没有释放 a
数组。我想从头开始重写你的代码更容易,这次想想你在做什么。
我相信你唯一的错误(除了 main 中数组 'a' 的维度)是你定义 g 的地方。 g 应该在这里定义:
for (unsigned int j=1 ; j<n ; j++)
{
unsigned int g= 0;
for (unsigned int k=0 ; k<n ; k++)
{
if (k!=i)
{
A[j-1][g]=a[j][k]; g++;
}
}
}
关于其他 n-1 件事,我明白你的意思,我认为他们是正确的
我正在尝试用 C++ 编写矩阵行列式函数。但是我的代码无法编译,也不知道为什么(我使用的是在线 C++ 编译器,iget 的错误消息是“* Error in `/var/www/service/usercode/519646917/a.out': free( ): 下一个大小无效(快速):0x00000000019c1180 * " )。看来问题出在Free函数上。
谁能告诉我我的代码有什么问题吗?
提前致谢 问候
#include <iostream>
#include <cmath>
#include <fstream>
#include <vector>
#include <numeric>
#include <iterator>
#include <map>
#include <string>
//C++ clang
using namespace std;
void Free(double** a, unsigned int n)
{
if (a!=NULL)
{
for (unsigned int j=0 ; j<n ; j++)
{
delete[] a[j];
}
delete[] a;
}
}
double mDeterminant(double** a, unsigned int n)
{
if (n==1)
{
return a[0][0];
}
else if(n==2)
{
return a[0][0]*a[1][1]-a[0][1]*a[1][0];
}
else
{
double res=0.0;
for (unsigned int i=0 ; i<n ; i++)
{
double** A=new double*[n-1];
for (unsigned int j=0 ; j<n-1 ; j++)
{
A[j]=new double[n-1];
}
for (unsigned int j=1 ; j<n ; j++)
{
unsigned int g=0;
for (unsigned int k=0 ; k<n ; k++)
{
if (k!=i)
{
A[j-1][g]=a[j][k]; g++;
}
}
}
res+=a[0][i]*pow(-1, i)*mDeterminant(A, n-1);
Free(A,n-1);
}
return res;
}
}
int main()
{
unsigned int N=4;
double** a=new double*[N];
for (unsigned int i=0 ; i<N ; i++)
{
a[i]=new double[N];
}
for (unsigned int i=0 ; i < N ; i++)
{
for (unsigned int j=0 ; j < N ; j++)
{
a[i][j]=(1+i)*(2+j-i);
cout << a[i][j] << ";";
}
cout << endl;
}
cout << "----------------------------------" << endl;
cout << "mDeterminant = " << mDeterminant(a, N) << endl;
}
您的错误太多:
a[i]=new double;
应该是 a[i]=new double[N];
。
double** A=new double*[n-1];
应该是 double** A=new double*[n];
或者下面的循环应该是直到 n-1。
A[j]=new double[n-1];
应该是 A[j]=new double[n];
或者下面的循环应该是直到 n-1。
这里 A[j-1][g]=a[j][k]; g++;
你的 g
超出了数组范围。您也没有释放 a
数组。我想从头开始重写你的代码更容易,这次想想你在做什么。
我相信你唯一的错误(除了 main 中数组 'a' 的维度)是你定义 g 的地方。 g 应该在这里定义:
for (unsigned int j=1 ; j<n ; j++)
{
unsigned int g= 0;
for (unsigned int k=0 ; k<n ; k++)
{
if (k!=i)
{
A[j-1][g]=a[j][k]; g++;
}
}
}
关于其他 n-1 件事,我明白你的意思,我认为他们是正确的