为代数符号中的上三角矩阵分配 space
Allocating space for upper triangular matrices in algebraic notation
我正在做一个涉及矩阵分解的项目(用 C 语言编写),我需要一些帮助。
我的 objective 是为上三角矩阵分配内存,我想通过代数行和列表示法访问它(即 {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;
}
我的代数索引 1 代码(我还没有检查分配的 space 是否为 null,等我不再胡闹时再做):
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]--;
}
它按照我想要的方式工作,但是我在释放我用过的 space 时遇到问题。我就是这样做的:
for(i = 1; i <= n; i++)
{
m[i]++;
}
for(i = 0; i < n; i++)
{
m[i] += (i);
free(m[i]);
}
m++;
free(m);
你们有什么建议吗?提前非常感谢^^。
这条线路有问题:
m--;
for(i = 0; i < n; i++)
{
m[i]--;
}
你正在递减 m,但是继续从 0 开始索引它......我猜你最终可能会弄乱堆结构。
我设法使您的代码 valgrind 没有错误,如下所示:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int** m;
int i, j, 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;
}
for(i = 0; i < n; i++)
{
m[i]--;
}
m--;
/* Access it like m[1][1] ... m[n][n], m[i][j] (with i <= j) */
/*
for (i = 1; i <= n; i++) {
for (j = i; j <= n; j++) {
m[i][j] = i+j;
}
}
*/
m++;
for(i = 0; i < n; i++)
{
m[i]++;
}
for(i = 0; i < n; i++)
{
m[i] += (i);
free(m[i]);
}
free(m);
return 0;
}
我正在做一个涉及矩阵分解的项目(用 C 语言编写),我需要一些帮助。
我的 objective 是为上三角矩阵分配内存,我想通过代数行和列表示法访问它(即 {1,2,...,n}
中的 i,j 而不是 {0,1,...,n-1}
中的 i,j) .
例如,在 5x5 矩阵中,如果我输入 matrix[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;
}
我的代数索引 1 代码(我还没有检查分配的 space 是否为 null,等我不再胡闹时再做):
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]--;
}
它按照我想要的方式工作,但是我在释放我用过的 space 时遇到问题。我就是这样做的:
for(i = 1; i <= n; i++)
{
m[i]++;
}
for(i = 0; i < n; i++)
{
m[i] += (i);
free(m[i]);
}
m++;
free(m);
你们有什么建议吗?提前非常感谢^^。
这条线路有问题:
m--;
for(i = 0; i < n; i++)
{
m[i]--;
}
你正在递减 m,但是继续从 0 开始索引它......我猜你最终可能会弄乱堆结构。
我设法使您的代码 valgrind 没有错误,如下所示:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int** m;
int i, j, 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;
}
for(i = 0; i < n; i++)
{
m[i]--;
}
m--;
/* Access it like m[1][1] ... m[n][n], m[i][j] (with i <= j) */
/*
for (i = 1; i <= n; i++) {
for (j = i; j <= n; j++) {
m[i][j] = i+j;
}
}
*/
m++;
for(i = 0; i < n; i++)
{
m[i]++;
}
for(i = 0; i < n; i++)
{
m[i] += (i);
free(m[i]);
}
free(m);
return 0;
}