读取文件(使用稀疏矩阵)并生成CSR

时间:2015-11-08 22:26:59

标签: c sparse-matrix numerical-methods

我需要读取.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;
}

有什么建议吗?

1 个答案:

答案 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]
  • 第一行的(非零)值(让我们称之为第0行;数学家不同意,但基于零的索引非常适合编程)可以在your_csr.column_indices[x]中找到your_csr.values[x]
  • 可以找到任何其他行0 <= x && x < your_csr.row_indices[0]的值r,其中your_csr.values[x]