C中非常大的矩阵

时间:2012-10-23 19:44:49

标签: c++ c

(这个问题早先得到解答,但解决方案无效或者我无法理解!!)
我想使用说2^16*2^16的大尺寸矩阵。怎么做? 这是我与malloc一起使用的代码:

// nrows=2^16
// ncols=2^16

 int **a_matrix = (int**) malloc (nrows *sizeof(int*));

for (int i=0; i<nrows;i++)
a_matrix[i]=(int*) malloc (ncols *sizeof(int));
enter code here

现在当我尝试访问a_matrix[55000][55000]给出分段错误

我将堆栈大小增加到无限(使用一些命令)但仍然无法正常工作。:( 还有其他办法吗?

编辑:我只想存储1/0所以即使bool也能正常工作。但在这种情况下同样的问题也是如此!

3 个答案:

答案 0 :(得分:3)

如果您只想存储布尔值,那么使用打包的位阵列会将存储空间降低到足以使其可能正常工作。在C ++中,您将使用std::vector<bool>std::bitset;在C,

#include <stdint.h>

unit32_t (*a_matrix)[1<<11] = malloc((1 << 16)*sizeof *a_matrix);

为您(如果malloc调用未失败)提供指向2^162^16数组的指针。要访问一下,请使用

((a_matrix[row][column >> 5]) >> (column & 0x1F)) & 1

最好将其作为一个功能

int bit_at(int row, int col) {
    return ((a_matrix[row][col >> 5]) >> (col & 0x1F)) & 1;
}

或者也许是一个宏。

答案 1 :(得分:2)

您可以尝试std::vector<bool> matrix(0x10000L * 0x10000L);并像这样访问它:

bool b = matrix[i*0x10000 + j];

matrix[i*0x10000 + j] = true;

这应该少于实施空间的1/8(或者是1/32?)。

答案 2 :(得分:0)

您无法在32位计算机上分配超过2GB(UBUNTU上为3GB)的内存。您可能必须实现自己的malloc()和您自己的分页系统以及vmm