我需要读取.txt
文件中的方阵并将其存储为CSR
格式。我知道如何阅读矩阵,但我还没有想过如何制作CSR
。
这是读取矩阵的代码:
#include<stdio.h>
#include<string.h>
int main(){
FILE *f;
int i,j,n;
float x;
f=fopen("file.txt","r");
if(f=NULL){
printf(\n No file found \n");
}
fscanf(f,"%d",&n);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
fscan(f,"%f",&x);
printf("\n element (%d,%d) = %f",i,j,x); //this is just to see that the matrix looks like I want it to be, it's not part of CSR problem
}
}
return 0;
}
有什么建议吗?
答案 0 :(得分:2)
让我们将CSR(或CRS,对于&#34;压缩行存储&#34;)结构解释为三个数组的结构:
natestrauser_select2.js:853 Uncaught TypeError: Cannot read property 'id' of undefined
此处,struct csr {
size_t row_count;
size_t *row_indices;
float *values;
size_t *column_indices;
};
和values
应指向相同大小的数组(或者,您可以将它们组织为一个column_indices
- int
对数组,并且double
应指向这两个数组的索引数组。 (实际上,我们会对row_indices
采取一些自由;而不是指向行的第一列/值,我们将指向最后一列之后的一点/行的值。)
您的row_indices
文件格式似乎包含方形矩阵,并以大小参数(*.txt
)开头。
n
阅读此struct csr your_csr;
size_t n;
fscanf(f, "%d", &n);
your_csr.row_count = n;
后,我们可以分配n
。不幸的是,我们不知道矩阵中会有多少非零值。目前,这个简单的实现只会分配row_indices
元素,而更保守的方法则留给读者。
n x n
现在我们已经掌握了记忆,让我们处理矩阵数据。
your_csr.row_indices = calloc(n, sizeof(your_csr.row_indices[0]));
your_csr.values = calloc(n * n, sizeof(your_csr.values[0]));
your_csr.column_indices = calloc(n * n, sizeof(your_csr.column_indices[0]));
对于您阅读的每个非零值,您都要将您所知道的内容写入size_t pair_index = 0;
for (size_t row_index = 0; row_index < n; row_index++) {
for (size_t column_index = 0; column_index < n; column_index++) {
float value;
fscanf(f, "%f", &value);
和values
数组
column_indices
在您阅读了一行后,您将记下该行结束的位置。
if (value != 0.0) {
your_csr.values[pair_index] = value;
your_csr.column_indices[pair_index] = column_index;
pair_index++;
}
}
现在, your_csr.row_indices[row_index] = pair_index;
}
包含您需要了解的有关矩阵的所有数据:
your_csr
包含矩阵中的行数。your_csr.row_count
。your_csr.row_indices[your_csr.row_count - 1]
所属的列,请查看your_csr.values[x]
。your_csr.column_indices[x]
中找到your_csr.values[x]
。0 <= x && x < your_csr.row_indices[0]
的值r
,其中your_csr.values[x]
。