大矩阵计算

large matrix computation

本文关键字:计算      更新时间:2023-10-16

我用c++写了一个简单的代码,我用g++在linux ubuntu 11.04上编译它,我没有得到任何错误,但当我运行可执行文件时,我得到这个错误"分段错误"。

我知道我的代码没有问题,这个错误与编译器有关。

有人能帮我吗?

我的代码是

#include <math.h>
int main()
{
    double a[200][200][200],b[200][200][200],c[200][200][200];
    int i,j,k;
    double const pi=3.14;
    for(k=0;k<200;k++)
    {
        for(j=0;j<200;j++)
        {
            for(i=0;i<200;i++)
            {
                a[i][j][k]=sin(1.5*pi*i)*cos(3.5*pi*j)*k;
                b[i][j][k]=cos(1.5*pi*i)*cos(2.5*pi*k)*j;
                c[i][j][k]=a[i][j][k]-b[i][j][k];
            }
        }
    }
}

这三个数组需要大约190MB的空间,这几乎肯定超过了操作系统施加的堆栈大小限制。

尝试在堆上分配它们(使用new),而不是将它们放在堆栈上。

这个函数可以帮助你:

double ***alloc3d(int l, int m, int n) {
    double *data = new double [l*m*n];
    double ***array = new double **[l];
    for (int i=0; i<l; i++) {
        array[i] = new double *[m];
        for (int j=0; j<m; j++) {
            array[i][j] = &(data[(i*m+j)*n]);
        }
    }
    return array;
}

您正在将巨大的double类型数组放入堆栈中(假设您的体系结构就是这样处理局部变量的)。几乎可以肯定的是,您的系统堆栈无法容纳那么多空间。

使用vector代替在堆上进行分配:

std::vector<std::vector<std::vector<double> > > a(200, std::vector<std::vector<double> >(200, std::vector<double>(200)));

堆栈溢出->分段错误

对于非对称情况,必须使用:

    double*** a=new double**[IE];
    for(int i=0;i<IE;i++){
        a[i]=new double *[JE];
        for(int j=0;j<JE;j++){
            a[i][j]=new double [KE];
        }
    }

使用上面的代码,我们可以在计算机内存允许的情况下构建巨大的矩阵。