【问题标题】:Allocating space for upper triangular matrices in algebraic notation用代数符号为上三角矩阵分配空间
【发布时间】: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


【解决方案1】:

这一行有问题:

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2016-10-03
    • 2017-06-17
    • 1970-01-01
    相关资源
    最近更新 更多