fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6. int M = 3;
  7. int N = 6;
  8. double A[3][6] = {{2, 5, -1, 9, -3, 6}, {7, 4, 2, 4, 2, 10}, {3, -2, -10, 1, 4, 2}};
  9.  
  10. if (M>=N)
  11. {
  12. printf("Row Size M should be smaller than Column Size N\nCannot hankelize this matrix\nPlease update M and N values\n");
  13. }
  14. else
  15. {
  16. double *hankel_vals = (double *) malloc((M+N-2) * sizeof (double));
  17. if (hankel_vals==NULL)
  18. {
  19. printf(" Out of memory \n");
  20. }
  21. else
  22. {
  23. // There are M+N-2 range of possible values in the Hankelized matrix
  24. // Precalculate them for assignment at appropriate places in the next step
  25. // This will prevent recalculating same value multiple times
  26. for (unsigned int sum_ind=0; sum_ind<=(M+N-2); sum_ind++)
  27. {
  28. int i = (sum_ind < N) ? 0 : (sum_ind - N + 1) ;
  29. int j = (sum_ind < N) ? sum_ind : (N-1);
  30. hankel_vals[sum_ind] = 0;
  31.  
  32. // Calculate SUM
  33. while ((j>=0)&&(i<M))
  34. {
  35. hankel_vals[sum_ind] += A[i++][j--];
  36. }
  37. printf("hankel_vals[sum_ind] : %f\n",hankel_vals[sum_ind]);
  38.  
  39. // Calculate Average
  40. if (sum_ind<M)
  41. {
  42. hankel_vals[sum_ind] = hankel_vals[sum_ind]/(sum_ind+1);
  43. }
  44. else if ( (M+N-2-sum_ind) < M )
  45. {
  46. hankel_vals[sum_ind] = hankel_vals[sum_ind]/(M+N-2-sum_ind+1);
  47. }
  48. else
  49. {
  50. hankel_vals[sum_ind] = hankel_vals[sum_ind]/M;
  51. }
  52. }
  53.  
  54. // Set and print values of each element of A with appropriate value calculated above
  55. for (unsigned int i=0; i<M; i++)
  56. {
  57. for (unsigned int j=0; j<N; j++)
  58. {
  59. A[i][j] = hankel_vals[i+j];
  60. printf(" %f ",A[i][j]);
  61. }
  62. printf("\n");
  63. }
  64. //free(hankel_vals);
  65. }
  66. }
  67. return 0;
  68. }
Success #stdin #stdout 0s 4388KB
stdin
Standard input is empty
stdout
hankel_vals[sum_ind] : 2.000000
hankel_vals[sum_ind] : 12.000000
hankel_vals[sum_ind] : 6.000000
hankel_vals[sum_ind] : 9.000000
hankel_vals[sum_ind] : -9.000000
hankel_vals[sum_ind] : 9.000000
hankel_vals[sum_ind] : 14.000000
hankel_vals[sum_ind] : 2.000000
 2.000000  6.000000  2.000000  3.000000  -3.000000  3.000000 
 6.000000  2.000000  3.000000  -3.000000  3.000000  7.000000 
 2.000000  3.000000  -3.000000  3.000000  7.000000  2.000000