如何在C中制作一个巨大的矩阵

时间:2015-06-01 13:31:00

标签: c matrix

我正在尝试使用100,000列和100,000行布尔类型(bool矩阵[100000] [100000])在C中定义矩阵,我是怎么做到的?

3 个答案:

答案 0 :(得分:2)

此处需要动态分配。所以你需要100000 * 100000 = 100亿比特。好多啊。

10,000,000,000位== 1,250,000,000字节== 1.164千兆字节。

所以有点超过一个千兆字节..这不是不可能,但你必须要小心。最好的方法是将它分配到一个数组中,如下所示:

uint8_t *matrix = malloc(1250000000);
if (matrix == NULL) // This will very likely fail, so be sure to handle it..
     return ENOMEM;

您现在只有一个数组。要访问元素[i][j],您需要i*10000+j。但是,由于我们已经分配了uint8_t数组,因此您需要提取所需的位。

要做到这一点,你可以有访问器宏,如下所示:

// You probably want to add matrix as a param for these macros
#define index(i, j)   (i*10000+j)
#define elem(i,j)   (matrix[index(i,j)/8])
#define get(i, j)   (elem(i,j) & (1 << index(i,j)%8))
#define set(i,j,v)  (v ? elem(i,j) |= (1 << index(i,j)%8) : elem(i,j) &= ~(1 << index(i,j)%8))

set(5000, 5000, TRUE);
if (get(5000, 5000))
   doStuff();

答案 1 :(得分:2)

在技术说明中,定义声明完全不同。我认为您要求类型同义词

typedef bool matrix[100000][100000];

类型matrix现在被定义为bool[100000][100000]的类型同义词。

matrix *m = malloc(sizeof *m);

m被声明为matrix的指针,并初始化为适当的malloc调用的返回值。

static matrix s;
根据评论中的建议,

s被声明为具有静态存储持续时间的matrix

这实在是非常低效。如果您不打算使用所有这些元素,也许您可​​以尝试使用某种有序的地图。我写了一个你可以使用的,称为PATRICIA trie,你可以找到here。如果你计划使用所有这些元素,那么你可以通过使用 all 来节省大量内存(以及缓存未命中形式的时间)数组中的位,而不是通常的1/8或更差,浪费是填充的形式。这需要一些稍微复杂的逻辑。

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef unsigned char matrix[100000][100000 / CHAR_BIT + (100000 % CHAR_BIT > 0)];

int matrix_get(matrix *m, size_t x, size_t y) {
    return ((*m)[x][y / CHAR_BIT] >> (y % CHAR_BIT)) & 1;
}

void matrix_set(matrix *m, size_t x, size_t y, int value) {
    (*m)[x][y / CHAR_BIT] &= ~(1U    << (y % CHAR_BIT));
    (*m)[x][y / CHAR_BIT] |=   value << (y % CHAR_BIT) ;
}

int main(void) {
    matrix *m = malloc(sizeof *m);
    memset(m, 0, sizeof *m);
    matrix_set(m, 0x1337, 0xC0DE, 1);
    printf("%d\n", matrix_get(m, 0x1337, 0xC0DE));
}

答案 2 :(得分:2)

如果您愿意进行一些掩蔽,可以分配int matrix[100000][1000000/(sizeof(int)*CHAR_BIT)+1]个字。你的程序会慢一点,但你会分配1/8的内存量。请参见BarBackgroundColor进行位屏蔽。

如果内存大小对于堆栈或堆来说太大,您可能会考虑How do you set, clear, and toggle a single bit?