我正在尝试将矩阵写入稀疏矩阵转换程序。 但是,我的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);
}
}
答案 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++;