Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

Sparse Matrix

By: FalseEconomy on Jan 25th, 2012  |  syntax: C  |  size: 3.59 KB  |  views: 45  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. //  Created by Matt Bessey on 18/01/2012.
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. typedef struct {
  8.     int x;
  9.     int y;
  10.     int value;
  11. } point;
  12.  
  13. typedef struct l{
  14.     point point;
  15.     struct l* next;
  16. } list;
  17.  
  18. typedef struct {
  19.     int n;
  20.     int m;
  21.     int elements;
  22.     list* first;
  23. } matrix_list;
  24.  
  25. typedef struct y{
  26.     int n;
  27.     int m;
  28.     int elements;
  29.     int *IA;
  30.     int *JA;
  31.     int *A;
  32. } yale;
  33.  
  34. matrix_list* readMatrix(FILE*);
  35.  
  36. int convertMatrix(matrix_list*, yale*);
  37.  
  38. matrix_list* readMatrix(FILE* file){
  39.     matrix_list* m = calloc(1, sizeof(matrix_list));
  40.    
  41.     fscanf (file, "%d %*c ", &m->n);
  42.     fscanf (file, "%d", &m->m);
  43.     list* a = calloc(1, sizeof(list));
  44.     fscanf(file, "%d %*c%d %*c%d",&a->point.x,&a->point.y,&a->point.value);
  45.     m->first = a;
  46.     list* end = a;
  47.     m->elements = 1;
  48.     for(char c = fgetc(file); c != EOF; c = fgetc(file)){
  49.         ungetc(c, file);
  50.         list* b = calloc(1,sizeof(list));
  51.         fscanf(file, "%d %*c%d %*c%d",&b->point.x,&b->point.y,&b->point.value);
  52.         end->next = b;
  53.         end = b;
  54.         m->elements++;
  55.         //printf("%d,%d,%d\n",b->point.x,b->point.y,b->point.value);
  56.     }
  57.     return m;
  58. }
  59.  
  60. int convertMatrix(matrix_list* input, yale* output){
  61.     int matrix_elements = input->elements;
  62.     int matrix_rows = input->m;
  63.        
  64.     int* A = (int*)calloc(matrix_elements, sizeof(int));
  65.     int* IA = (int*)calloc(matrix_rows + 1, sizeof(int));    
  66.     int* JA = (int*)calloc(matrix_elements, sizeof(int));
  67.    
  68.     printf("%d elements\n",matrix_elements);
  69.    
  70.     output->A = A;      // Value
  71.     output->IA = IA;          // Row (X)
  72.     output->JA = JA;     // Column (Y)
  73.     output->elements = matrix_elements;
  74.     output->m = matrix_rows;
  75.     output->n = input->n;
  76.    
  77.     list* tmp_list = input->first;
  78.    
  79.     for(int i = 0, j = 0, tmp_y = 0; i < matrix_elements && tmp_list!=NULL; i++){
  80.         printf("Input Value: %d \n",tmp_list->point.value);
  81.         A[i] = tmp_list->point.value;
  82.         // Initialise the first row
  83.         if(i == 0) IA[0] = tmp_list->point.x;
  84.         else{
  85.             // Add a new row index
  86.             if(tmp_y != tmp_list->point.x){
  87.                 j++;
  88.                 IA[j] = i;
  89.                 tmp_y = tmp_list->point.x;
  90.             }
  91.         }
  92.         JA[i] = tmp_list->point.y;
  93.         tmp_list = tmp_list->next;
  94.     }
  95.    
  96.     for(int i = 0; i < matrix_elements; i++)
  97.         printf("%d,",output->A[i]);
  98.     printf("\n");
  99.     for(int i = 0; i < matrix_rows + 1; i++)
  100.         printf("%d,",output->IA[i]);
  101.     printf("\n");
  102.     for(int i = 0; i < matrix_elements; i++)
  103.         printf("%d,",output->JA[i]);
  104.    
  105.     return 1;
  106. }
  107.  
  108. int main (int argc, const char * argv[])
  109. {
  110.     if (argc==1) {
  111.         perror("No arguments provided\n");
  112.         return -1;
  113.     }
  114.     FILE* pFile;
  115.     pFile = fopen(argv[2], "r");
  116.     if (pFile == NULL) {
  117.         perror("Couldn't open file\n");
  118.         return -1;
  119.     } else {
  120.         //printf("Opened file %s\n",argv[1]);
  121.     }
  122.     matrix_list* pre_yale = readMatrix(pFile);
  123.     yale yale;
  124.     convertMatrix(pre_yale, &yale);
  125.    
  126.     if (!strncmp(argv[1], "stage3", 6)){
  127.         printf("\n\nBegin Main\n\n");
  128.         for(int i = 0; i < yale.elements; i++)
  129.             printf("%d,",yale.A[i]);
  130.         printf("\n");
  131.         for(int i = 0; i < yale.m + 1; i++)
  132.             printf("%d,",yale.IA[i]);
  133.         printf("\n");
  134.         for(int i = 0; i < yale.elements; i++)
  135.             printf("%d,",yale.JA[i]);
  136.     }
  137.     printf("\n");
  138.  
  139.     fclose(pFile);
  140.     return 0;
  141. }