我在c中实现了一个矩阵库。我已经制作了一个向量库,我已经定义了一个矩阵,除了指向向量的指针集合之外什么都没有(所以每个指针都引用了一个向量结构体,这是矩阵列。)我有一个指针的指针,而不是指针的数组,因为a)我想让锯齿矩阵成为可能b)我想让向量运算在矩阵的各个列上工作c)我想让实际的矩阵是动态的。
下面是矩阵类型的定义:
typedef struct mat {
size_t alloc; // num of allocated bytes
size_t w, h; // dimensions for the matrix
vec** cols; // each column is a vector
} mat;
假设我想调整矩阵的维数。下面的代码对我来说很好:
void resizem(mat* m, size_t w, size_t h) {
m -> alloc = w * VECTOR_SIZE;
m -> cols = realloc(m -> cols, m -> alloc);
// if(w > m -> w) {
// memset(m -> cols + m -> w, init_vec(h), (w - (m -> w)) * VECTOR_SIZE);
// }
if(w > m -> w) {
for(int i = m -> w; i < w; i++) {
m -> cols[i] = init_vec(h);
};
}
for(int i = 0; i < w; i++) {
resizev(m -> cols[i], h);
};
m -> w = w;
m -> h = h;
}
我的方法如下:1)重新计算字节的数量来重新分配并将其存储在矩阵结构中(列的数量*列的大小)2)重新分配内存到列3)如果矩阵在宽度上"增长",那么每个新列需要初始化为默认向量。4)调整矩阵中每个向量的大小。
但是,请注意注释掉的行。为什么我不能只是添加一个偏移量(前矩阵的大小)到列指针,并在其余列上使用memset将它们初始化为默认向量?当我运行这个时,它不起作用,所以我使用for循环代替。请注意,如果它有帮助的话,这里是到目前为止github到vector库的链接:
当您使用memset()
时,您只调用initvec()
一次。所以所有的元素都指向相同的向量。
同样,memset()
将值分配给数组中的每个字节。但是你的行应该包含指针,而不是字节。
顺便说一句,你的代码泄漏了很多内存,因为你从来没有在行中free()
旧的指针。您需要在调用realloc()
之前这样做。