-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmatrizVectorP1.c
123 lines (99 loc) · 2.71 KB
/
matrizVectorP1.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
int main( int argc, char *argv[] ) {
int m, n, test, i, j;
float alfa;
struct timeval t0, t1, t;
// Parámetro 1 -> m
// Parámetro 2 -> n
// Parámetro 3 -> alfa
// Parámetro 4 -> booleano que nos indica si se desea imprimir matrices y vectores de entrada y salida
if(argc>3){
m = atoi(argv[1]);
n = atoi(argv[2]);
alfa = atof(argv[3]);
test = atoi(argv[4]);
}
else{
printf("NUMERO DE PARAMETROS INCORRECTO\n");
exit(0);
}
float *x = (float *) malloc(n*sizeof(float));
float *A = (float *) malloc(m*n*sizeof(float));
float *y = (float *) malloc(m*sizeof(float));
// Se inicializan la matriz y los vectores
for(i=0; i<m; i++){
for(j=0; j<n; j++){
A[i*n+j] = 1+i+j;
}
}
for(i=0; i<n; i++){
x[i] = (1+i);
}
for(i=0; i<m; i++){
y[i] = (1-i);
}
if(test){
printf("\nMatriz A es...\n");
for(i=0; i<m; i++){
for(j=0; j<n; j++){
printf("%f ", A[i*n+j]);
}
printf("\n");
}
printf("\nVector x es...\n");
for(i=0; i<n; i++){
printf("%f ", x[i]);
}
printf("\n");
printf("\nVector y al principio es...\n");
for(i=0; i<m; i++){
printf("%f ", y[i]);
}
printf("\n");
}
// Parte fundamental del programa
assert (gettimeofday (&t0, NULL) == 0);
for (i=0; i<m; i++) {
for (j=0; j<n; j++) {
y[i] += alfa*A[i*n+j]*x[j];
}
}
assert (gettimeofday (&t1, NULL) == 0);
timersub(&t1, &t0, &t);
if(test){
printf("\nAl final vector y es...\n");
for(i=0; i<m; i++){
printf("%f ", y[i]);
}
printf("\n");
float *testy = (float *) malloc(m*sizeof(float));
for(i=0; i<m; i++){
testy[i] = 1-i;
}
// Se calcula el producto sin ninguna vectorización
for (i=0; i<m; i++) {
for (j=0; j<n; j++) {
testy[i] += alfa*A[i*n+j]*x[j];
}
}
int errores = 0;
for(i=0; i<m; i++){
if(testy[i] != y[i]){
errores++;
printf("\n Error en la posicion %d porque %f != %f", i, y[i], testy[i]);
}
}
printf("\n%d errores en el producto matriz vector con dimensiones %dx%d\n", errores, m, n);
free(testy);
}
printf ("Tiempo = %ld:%ld(seg:mseg)\n", t.tv_sec, t.tv_usec/1000);
free(x);
free(y);
free(A);
return 0;
}