Advertisement
Guest User

Untitled

a guest
Jun 18th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.51 KB | None | 0 0
  1. int main() {
  2. int v_dim;
  3. MY_VECTOR *v_tab[2];
  4.  
  5. printf("Podaj wymiar wektorow\n");
  6. scanf_s("%d", &v_dim);
  7.  
  8. for (int i = 0; i < 2; i++) {
  9. v_tab[i] = input_vector(i, v_dim);
  10. }
  11.  
  12. DWORD start = GetTickCount();
  13. double dot = dot_product_simple(v_tab);
  14. DWORD end = GetTickCount();
  15. assert((int)dot == v_dim);
  16.  
  17. DWORD start2 = GetTickCount();
  18. double dot2 = dot_product_advanced(v_tab);
  19. DWORD end2 = GetTickCount();
  20. assert((int)dot2 == v_dim);
  21.  
  22. printf("Iloczyn skalarny: %lf\n", dot);
  23. printf("Szybkosc zwyklego: %u, szybkosc z rozwinieciem: %u\n", end - start, end2 - start2);
  24.  
  25. for (int i = 0; i < 2; i++) {
  26. free_vector(v_tab[i]);
  27. }
  28.  
  29. system("pause");
  30. return 0;
  31. }
  32. ---------------------------------------------------------------------------------------------------
  33. MY_VECTOR * create_vector(int dim, double *buff, char *str) {
  34. MY_VECTOR *v = (MY_VECTOR*)malloc(sizeof(MY_VECTOR));
  35.  
  36. strcpy_s(v->str, 64, str);
  37.  
  38. v->dim = dim;
  39. v->buff = buff;
  40.  
  41. return v;
  42. }
  43.  
  44. MY_VECTOR * input_vector(int num, int dim) {
  45. char str[64];
  46. double *buff = (double*) malloc(sizeof(double)*dim);
  47.  
  48. printf("Podaj nazwe wektora\n");
  49. scanf_s("%s", str, 64);
  50.  
  51. for (int i = 0; i < dim; i++) {
  52. if (num == 0)
  53. buff[i] = 1 / (double)(i + 1);
  54. else
  55. buff[i] = i + 1;
  56. }
  57.  
  58. return create_vector(dim, buff, str);
  59. }
  60.  
  61. void free_vector(MY_VECTOR *v) {
  62. if (v) {
  63. if (v->buff)
  64. free(v->buff);
  65. free(v);
  66. }
  67. }
  68.  
  69. double dot_product_simple(MY_VECTOR *v_tab[]) {
  70. assert(v_tab[0]->dim == v_tab[1]->dim);
  71.  
  72. double sum = 0;
  73. for (int i = 0; i < v_tab[0]->dim; i++) {
  74. sum += v_tab[0]->buff[i] * v_tab[1]->buff[i];
  75. }
  76. return sum;
  77. }
  78.  
  79. double dot_product_advanced(MY_VECTOR * v_tab[]) {
  80. assert(v_tab[0]->dim == v_tab[1]->dim);
  81.  
  82. int dim = v_tab[0]->dim;
  83.  
  84. double sum = 0.0f;
  85.  
  86. int dim_rest = 0;
  87. if (dim % 8 != 0)
  88. dim_rest = dim % 8;
  89.  
  90. int dim_repeats = (dim - dim_rest) / 8;
  91.  
  92. for (int i = 0; i < dim_repeats; i++) {
  93. sum += v_tab[0]->buff[i ] * v_tab[1]->buff[i ];
  94. sum += v_tab[0]->buff[i + 1] * v_tab[1]->buff[i + 1];
  95. sum += v_tab[0]->buff[i + 2] * v_tab[1]->buff[i + 2];
  96. sum += v_tab[0]->buff[i + 3] * v_tab[1]->buff[i + 3];
  97. sum += v_tab[0]->buff[i + 4] * v_tab[1]->buff[i + 4];
  98. sum += v_tab[0]->buff[i + 5] * v_tab[1]->buff[i + 5];
  99. sum += v_tab[0]->buff[i + 6] * v_tab[1]->buff[i + 6];
  100. sum += v_tab[0]->buff[i + 7] * v_tab[1]->buff[i + 7];
  101. }
  102.  
  103. for (int i = (dim - dim_rest); i < dim; i++) {
  104. sum += v_tab[0]->buff[i] * v_tab[1]->buff[i];
  105. }
  106. return sum;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement