Проблема разреженной матрицы (в моей функции scan_matrix есть проблема) - PullRequest
0 голосов
/ 20 июня 2011

Я пытаюсь написать программу преобразования матрицы в разреженную матрицу. Но есть проблема в моей функции 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 ]

4 голосов
/ 20 июня 2011
mysparse[place++].row = row;
mysparse[place++].column = column;
mysparse[place++].value = matrix[row][column];

Вы увеличиваете place в три раза.

2 голосов
/ 20 июня 2011

Вы ошиблись в цикле строк / столбцов. Вместо:

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

вам нужно:

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

Ваш код эффективно транспонировал матрицу. На самом деле, для вводимых вами данных это не имеет значения, поскольку матрица симметрична, и поэтому вам это пока не нравится.

Также см. Ответ @ Бантэра для другой ошибки!

1 голос
/ 20 июня 2011

Проблема здесь

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++;
...