Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.54 KB | None | 0 0
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<time.h>
  4.  
  5. void printTab(double **tab, int rows, int columns) {
  6. for(int i = 0; i < rows; i++) {
  7. for(int j = 0; j < columns; j++) {
  8. printf("%lf ", tab[i][j]);
  9. }
  10. printf("\n");
  11. }
  12. }
  13.  
  14. void printTab2(double **tab, int rows) {
  15. double a;
  16. for(int i = 0; i < rows; i++) {
  17. a = tab[i][0];
  18. if(a != 0.0) {
  19. printf("%lf %d", a, (int) tab[i][1]);
  20. printf("\n");
  21. }
  22. }
  23. }
  24.  
  25. int main(){
  26. int n, m, k, i, j, p;
  27. printf("Podaj n, m i k jako rozmiar macierzy NxM i liczbe niezerowych elementow:\n");
  28. scanf("%d %d %d", &n, &m, &k);
  29. double **A;
  30. double **B;
  31. A = (double**)malloc(n * sizeof(double*));
  32. for (i = 0; i < n; i++)
  33. A[i] = (double*)malloc(m * sizeof(double));
  34.  
  35. B = (double**)malloc(n * sizeof(double*));
  36. for (i = 0; i < n; i++)
  37. B[i] = (double*)malloc(m * sizeof(double));
  38.  
  39. double **CRS;
  40. double **CCS;
  41. CRS = (double**)malloc(n * (k + 1) * sizeof(double*));
  42. for (i = 0; i < n * (k + 1); i++)
  43. CRS[i] = (double*)malloc(2 * sizeof(double));
  44. CCS = (double**)malloc(m * (k + 1) * sizeof(double*));
  45. for (i = 0; i < m * (k + 1); i++)
  46. CCS[i] = (double*)malloc(2 * sizeof(double));
  47.  
  48. srand(time(NULL));
  49.  
  50. double a;
  51. int size;
  52. if(n < m) size = n;
  53. else size = m;
  54.  
  55. for(i = 0; i < size; i++) {
  56. a = 1.0 + (double)rand() / RAND_MAX;
  57. A[i][i] = a;
  58. }
  59.  
  60. for(i = 0; i < n; i++) {
  61. for(j = 0; j < k; j++) {
  62. p = rand() % m;
  63. while(p == i) p = rand () % m;
  64. a = (double)rand() / RAND_MAX;
  65. A[i][p] = a;
  66. }
  67. }
  68.  
  69. //wypis macierzy
  70. printTab(A, n, m);
  71.  
  72. int l = 0;
  73. printf("CRS:\n");
  74. for(i = 0; i < n; i++) {
  75. for(j = 0; j < m; j++) {
  76. a = A[i][j];
  77. if(a != 0.0){
  78. //printf("%lf %d\n", a, j);
  79. CRS[l][0] = a;
  80. CRS[l][1] = j;
  81. l++;
  82. }
  83. }
  84. }
  85. printTab2(CRS, n*(k+1));
  86.  
  87. l = 0;
  88. printf("\nCCS:\n");
  89. for(i = 0; i < m; i++) {
  90. for(j = 0; j < n; j++) {
  91. a = A[j][i];
  92. if(a != 0.0){
  93. //printf("%lf %d\n", a, j);
  94. CCS[l][0] = a;
  95. CCS[l][1] = j;
  96. l++;
  97. }
  98. }
  99. }
  100. printTab2(CCS, m*(k+1));
  101.  
  102. //dekompresja CRS
  103. int row = 0;
  104. int prevCol, col;
  105. double v;
  106. prevCol = (int)CRS[0][1];
  107. for(i = 0; i < n*(k+1); i++) {
  108. v = CRS[i][0];
  109. if(v != 0.0) {
  110. col = (int)CRS[i][1];
  111. if(col <= prevCol && i > 0){
  112. row++;
  113. }
  114. B[row][col] = v;
  115. prevCol = col;
  116. }
  117. }
  118.  
  119. printTab(B, n, m);
  120.  
  121. int error = 0;
  122. for(int i = 0; i < n; i++) {
  123. for(int j = 0; j < m; j++) {
  124. if(A[i][j] != B[i][j]) error++;
  125. }
  126. }
  127. printf("CRS error: %d\n", error);
  128.  
  129.  
  130. return 0;
  131.  
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement