【发布时间】:2015-04-25 11:21:09
【问题描述】:
我正在做一个涉及矩阵分解的项目(用 C 语言编写),我需要一些帮助。
我的目标是为上三角矩阵分配内存,我想通过代数行和列表示法访问它(即{1,2,...,n} 中的 i,j 而不是{0,1,...,n-1} 中的 i,j)。
例如,在一个 5x5 矩阵中,如果我输入 matrix[3][4],我应该能够访问 [3][4] 元素。
我的非代数索引上三角矩阵代码如下所示:
double** malloc_sup_matrix (int n)
{
double** L;
int i;
L = (double**)malloc((n)*sizeof(double*));
if(L == NULL)
printerror("allocating space for the matrix (rows).");
for(i = 0; i < n; i++)
{
L[i] = (double*)malloc((n-i)*sizeof(double));
if(L[i] == NULL)
printerror("allocating space for the matrix (cols).");
L[i]-=i;
}
return L;
}
我的代数索引一的代码(我还没有检查分配的空间是否为空,当我停止搞砸这个时我会这样做):
int** m;
int i, n;
n = 10;
m = (int**)malloc((n+1)*sizeof(int*));
for(i = 0; i < n; i++)
{
m[i] = (int*)calloc((n+1)-(i),sizeof(int));
m[i] -= i;
}
m--;
for(i = 0; i < n; i++)
{
m[i]--;
}
它按我想要的方式工作,但是我在释放我使用的空间时遇到了问题。我就是这样做的:
for(i = 1; i <= n; i++)
{
m[i]++;
}
for(i = 0; i < n; i++)
{
m[i] += (i);
free(m[i]);
}
m++;
free(m);
你们有什么建议吗?提前谢谢你^^。
【问题讨论】:
-
"但我在释放已用空间时遇到问题。"请明确。你遇到了什么问题?
-
我建议重新考虑您的存储概念。除了为
n不同大小的向量(可以位于内存中的任何位置)分配空间外,您还可以使用一个维度为n(n+1)/2的向量。这有几个优点,其中包括与 Blas 和 Lapack 的互操作性。
标签: c matrix malloc free algebra