gpt4 book ai didi

c - C程序内存不足

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:58:33 25 4
gpt4 key购买 nike

<分区>

我写了下面的程序,用大数组实现了一个算法,但是当 N 超过 820 时,我有一个内存段错误问题(核心转储)。我使用 3 个大数组来实现我的代码。我该如何解决这个错误?

#define N 400

void upper(float A[N][N], float x[N], float b[N])
{
int i,j;
float sum;
x[N-1] = b[N-1]/A[N-1][N-1];

for(i=N-2; i>=0; i--){
sum = b[i];
for(j=i+1; j<N; j++){
sum = sum - x[j]*A[i][j];
}
x[i] = sum /A[i][i];
}
}

void lower(float A[N][N], float x[N], float b[N])
{
int i,j;
float sum;
x[0] = b[0]/A[0][0];
for(i=1; i<N; i++){
sum = b[i];
for(j=0; j<i; j++){
sum = sum - x[j]*A[i][j];
}
x[i] = sum /A[i][i];
}
}


void cholesky(float A[N][N],float L[N][N])
{
int i,j,k;
float sum;

for(i=0; i<N; i++){
for(j=i-4; j<i; j++){ //j-4 because i have 0 and i want to do less computations
if(j<0)
continue;
sum = A[i][j];
for(k=i-4; k<i; k++){
if(k>=0)
sum = sum - L[i][k]*L[j][k];
}
L[i][j] = sum /L[j][j];
}
sum = A[i][i];
for(k=i-4; k<i; k++){
if(k>=0)
sum = sum - L[i][k]*L[i][k];
}
L[i][i] = sqrt(sum);
}
}

void transpose(float L[N][N], float LT[N][N])
{
int i,j;
for(i=0; i<N; i++){
for(j=0; j<N; j++){
LT[i][j] = L[j][i];
}
}
}

void table(float A[N][N], float aii, float aone, float athree)
{
int i,j;

for(i=0; i<N; i++){
for(j=0; j<N; j++){
if(i==j){
A[i][j] = aii;
}
else if((i+1 ==j) || (i-1==j)){
A[i][j] = aone;
}
else if(i+3==j || i-3==j){
A[i][j] = athree;
}
else{
A[i][j] = 0;
}
}
}
}

void vector(float b[N], float b1, float b2, float all)
{
int i;
for(i=0; i<N; i++){
b[i] = all;
}
b[0] = b[N-1] = b1;
b[1] = b[N-2] = b2;
b[2] = b[N-3] = b2;
}

int main()
{
float A[N][N];
float L[N][N],LT[N][N];
float x[N];
float y[N];
float b[N];
int i,j;

table(A,12,-5,1);
vector(b,4,-1,0);

table(L,0,0,0);
cholesky(A,L);
transpose(L,LT);
lower(L,y,b);
upper(LT,x,y);

for(i=0; i<N; i++){
printf("%f\n",x[i]);
}
}

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com