稀疏矩阵问题(我的scan_matrix函数存在问题)

时间:2011-06-20 13:29:44

标签: c sparse-matrix

我正在尝试将矩阵写入稀疏矩阵转换程序。 但是,我的scan_matrix函数存在问题。我无法弄清楚问题出在哪里。根据Nemiver(调试程序)问题在我的fscanf调用中... 我的代码:

void scan_matrix(FILE *inp, struct sparse_m mysparse[], int *place_p)
{
    int matrix[9][9];
    int row,column,place=0;
    for(column=0;column<9;column++){
        for(row=0;row<9;row++){
            fscanf(inp, "%d", &matrix[row][column]);
        }
    }
    for(column=0;column<9;column++){
        for(row=0;row<9;row++){
            if( matrix[row][column] != 0 ) {
                mysparse[place++].row = row;
                mysparse[place++].column = column;
                mysparse[place++].value = matrix[row][column];
            }
        }
    }
    *place_p = place;
}

和我的二维矩阵:

64  -16     0   -16     0     0     0     0     0
-16  64   -16     0   -16     0     0     0     0
0   -16    64     0     0   -16     0     0     0
-16   0     0    64   -16     0   -16     0     0
0   -16     0   -16    64   -16     0   -16     0
0     0   -16     0   -16    64     0     0   -16
0     0     0   -16     0     0    64   -16     0
0     0     0     0   -16     0   -16    64   -16
0     0     0     0     0   -16     0   -16    64

输出必须是这样的;

(3, 0)  64
(4, 1)  -16
(5, 2)  -16
(6, 3)  -16
(7, 4)  64
(8, 5)  -16
(7, 6)  -16
(8, 7)  -16
(8, 8)  64

我的完整代码;

#include <stdio.h>

struct sparse_m {
    int row,
        column,
        value;
};
void write_sparse(FILE *outp, struct sparse_m mysparse[], int c);
void scan_matrix(FILE *inp, struct sparse_m mysparse[],int *place_p);

int main(void)
{
    int a = 0;
    FILE *inp_txt;
    FILE *outp_txt;
    inp_txt = fopen("s_matrix.dat", "r");
    outp_txt = fopen("sparse.dat", "w");
    struct sparse_m mys[10];
    scan_matrix(inp_txt, mys,&a);
    write_sparse(outp_txt,mys,a);

    return(0);
}
void scan_matrix(FILE *inp, struct sparse_m mysparse[], int *place_p)
{
    int matrix[9][9];
    int row,column,place=0;
    for(column=0;column<9;column++){
        for(row=0;row<9;row++){
            fscanf(inp, "%d", &matrix[row][column]);
        }
    }
    for(column=0;column<9;column++){
        for(row=0;row<9;row++){
            if( matrix[row][column] != 0 ) {
                mysparse[place++].row = row;
                mysparse[place++].column = column;
                mysparse[place++].value = matrix[row][column];
            }
        }
    }
    *place_p = place;
}

void write_sparse(FILE *outp, struct sparse_m mysparse[], int c)
{
    int i;
    printf("%d---", c);
    for(i=0;i<c;i++){
        fprintf(outp, "(%d, %d)  %d\n", mysparse[i].row,
                                        mysparse[i].column,
                                        mysparse[i].value);
    }
}

3 个答案:

答案 0 :(得分:4)

mysparse[place++].row = row;
mysparse[place++].column = column;
mysparse[place++].value = matrix[row][column];

您正在增加place三次。

答案 1 :(得分:2)

你的行/列循环错误。而不是:

for(column=0;column<9;column++){
    for(row=0;row<9;row++){

你需要:

for(row=0;row<9;row++){
    for(column=0;column<9;column++){

您的代码有效地转置了矩阵。实际上对于你给出的输入并不重要,因为矩阵是对称的,所以你现在就可以使用它。

另见@ Banthar对另一个错误的回答!

答案 2 :(得分:1)

问题出在这里

mysparse[place++].row = row;
mysparse[place++].column = column;
mysparse[place++].value = matrix[row][column];

您正在使用上面的每个作业递增您正在写入的myspase索引。将其更改为以下内容:

mysparse[place].row = row;
mysparse[place].column = column;
mysparse[place].value = matrix[row][column];
place++;