2015-12-17 91 views
0

我尝试解决4个变量和600000个约束的线性优化问题。 我需要生成一个大的输入。所以我需要约束系数A[600000][4]b[600000]右边的部分。这里是生成600000个约束的代码。C中的大2d阵列

int i, j; 
int numberOfInequalities = 600000; 
double c[4]; 
double result[4];; 
double A[numberOfInequalities][4], b[numberOfInequalities]; 

printf("\nPreparing test: 4 variables, 600000 inequalities\n"); 
A[0][0] = 1.0; A[0][1] = 2.0; A[0][2] = 1.0; A[0][3] = 0.0; b[0] = 10000.0; 
A[1][0] = 0.0; A[1][1] = 1.0; A[1][2] = 2.0; A[1][3] = 1.0; b[1] = 10000.0; 
A[2][0] = 1.0; A[2][1] = 0.0; A[2][2] = 1.0; A[2][3] = 3.0; b[2] = 10000.0; 
A[3][0] = 4.0; A[3][1] = 0.0; A[3][2] = 1.0; A[3][3] = 1.0; b[3] = 10000.0; 
c[0]=1.0; c[1]=1.0; c[2]=1.0; c[3]=1.0; 
for(i=4; i< 100000; i++) 
{ 
    A[i][0] = (12123*i)%104729; 
    A[i][1] = (47*i)%104729; 
    A[i][2] = (2011*i)%104729; 
    A[i][3] = (7919*i)%104729; 
    b[i] = A[i][0] + 2*A[i][1] + 3*A[i][2] + 4* A[i][3] + 1 + (i%137); 
} 
A[100000][0] = 0.0; A[100000][1] = 6.0; A[100000][2] = 1.0; 
A[100000][3] = 1.0; b[100000] = 19.0; 
for(i=100001; i< 200000; i++) 
{ 
    A[i][0] = (2323*i)%101111; 
    A[i][1] = (74*i)%101111; 
    A[i][2] = (2017*i)%101111; 
    A[i][3] = (7915*i)%101111; 
    b[i] = A[i][0] + 2*A[i][1] + 3*A[i][2] + 4* A[i][3] + 2 + (i%89); 
} 
A[200000][0] = 5.0; A[200000][1] = 2.0; A[200000][2] = 0.0; 
A[200000][3] = 1.0; b[200000] = 13.0; 
for(i=200001; i< 300000; i++) 
{ 
    A[i][0] = (23123*i)%100003; 
    A[i][1] = (47*i)%100003; 
    A[i][2] = (2011*i)%100003; 
    A[i][3] = (7919*i)%100003; 
    b[i] = A[i][0] + 2*A[i][1] + 3*A[i][2] + 4* A[i][3] + 2 + (i%57); 
} 
A[300000][0] = 1.0; A[300000][1] = 2.0; A[300000][2] = 1.0; 
A[300000][3] = 3.0; b[300000] = 20.0; 
A[300001][0] = 1.0; A[300001][1] = 0.0; A[300001][2] = 5.0; 
A[300001][3] = 4.0; b[300001] = 32.0; 
A[300002][0] = 7.0; A[300002][1] = 1.0; A[300002][2] = 1.0; 
A[300002][3] = 7.0; b[300002] = 40.0; 
for(i=300003; i< 400000; i++) 
{ 
    A[i][0] = (13*i)%103087; 
    A[i][1] = (99*i)%103087; 
    A[i][2] = (2012*i)%103087; 
    A[i][3] = (666*i)%103087; 
    b[i] = A[i][0] + 2*A[i][1] + 3*A[i][2] + 4* A[i][3] + 1; 
} 
for(i=400000; i< 500000; i++) 
{ 
    A[i][0] = 1; 
    A[i][1] = (17*i)%999983; 
    A[i][2] = (1967*i)%444443; 
    A[i][3] = 2; 
    b[i] = A[i][0] + 2*A[i][1] + 3*A[i][2] + 4* A[i][3] + (1000000.0/(double)i); 
} 
for(i=500000; i< 600000; i++) 
{ 
    A[i][0] = (3*i)%111121; 
    A[i][1] = (2*i)%999199; 
    A[i][2] = (2*i)%444443; 
    A[i][3] = i; 
    b[i] = A[i][0] + 2*A[i][1] + 3*A[i][2] + 4* A[i][3] + 1.3; 
} 

的问题是:它不会引起这么大的阵列,它只是终止在运行时间,但如果我没有创造20万点以上的限制更多,它工作正常。 我试图将堆栈大小增加到无限值,但它没有帮助。 我试过使用像** A这样的指针,但在输出中出现错误的结果。 P.S. 我使用Ubuntu。 有什么建议吗?

+1

你可以使用[动态内存分配(/q /2461638分之917783)。 –

回答

3

如果numberOfInequalities是运行时间不变,你可以把一个#define并定义Ab为全局变量或static局部变量:

#define numberOfInequalities 600000 
static double A[numberOfInequalities][4], b[numberOfInequalities]; 

这将这些阵列从“堆”转移到' bss'段。

更好的解决方案是与malloc分配这些阵列:

double (*A)[4] = malloc(numberOfInequalities * 4 * sizeof(double)); 
double *b = malloc(numberOfInequalities * sizeof(double)); 

这将导致从“堆”存储器分配这些阵列。 不要忘记在返回给调用者之前释放它们。

见http://www.geeksforgeeks.org/memory-layout-of-c-program/了简要说明内存如何布置于一个典型的C程序

+0

感谢您的编辑,但您链接的文章有点过分简单,并不能解释为什么堆栈的深度有限。在更新的操作系统版本,尤其是64位版本中,内存布局更加复杂。从堆栈中分配如此多的内存确实存在问题,但精确的解释相当模糊。 – chqrlie