-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathVector.c
More file actions
131 lines (99 loc) · 3.09 KB
/
Vector.c
File metadata and controls
131 lines (99 loc) · 3.09 KB
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
120
121
122
123
124
125
126
127
128
129
130
131
#include "FFTSVD.h"
/* Constructors and Destructors */
Vector Vector_allocate(unsigned int length) {
return (Vector)calloc(length, sizeof(real));
}
void Vector_free(Vector vector) {
free(vector);
}
/* Initialization and Copying */
void Vector_copy(Vector vectordest, Vector vectorsrc, unsigned int length) {
unsigned int i;
#pragma ivdep
for (i = 0; i < length; i++)
vectordest[i] = vectorsrc[i];
}
void Vector_copypiece(Vector vectordest, unsigned int destStart, Vector vectorsrc, unsigned int srcStart,unsigned int length) {
unsigned int i;
#pragma ivdep
for (i = 0; i < length; i++)
vectordest[destStart + i] = vectorsrc[srcStart + i];
}
void Vector_copyscaledpiece(Vector vectordest, unsigned int destStart, Vector vectorsrc, unsigned int srcStart,unsigned int length, real scalefactor) {
unsigned int i;
#pragma ivdep
for (i = 0; i < length; i++)
vectordest[destStart + i] = scalefactor * vectorsrc[srcStart + i];
}
void Vector_zero(Vector vector, unsigned int length) {
unsigned int i;
#pragma ivdep
for (i = 0; i < length; i++)
vector[i] = (real)0;
}
/* Arithmetic Operations */
void Vector_scale(Vector vector, real scale, unsigned int length) {
unsigned int i;
#pragma ivdep
for (i = 0; i < length; i++)
vector[i] *= scale;
}
void Vector_subtractscaledvector(Vector vector1, real scale, Vector vector2, unsigned int length) {
unsigned int i;
#pragma ivdep
for (i = 0; i < length; i++)
vector1[i] -= scale * vector2[i];
}
void Vector_addscaledvector(Vector vector1, real scale, Vector vector2, unsigned int length) {
unsigned int i;
#pragma ivdep
for (i = 0; i < length; i++)
vector1[i] += scale * vector2[i];
}
void Vector_addvector(Vector vector1, Vector vector2, unsigned int length) {
unsigned int i;
#pragma ivdep
for (i = 0; i < length; i++)
vector1[i] += vector2[i];
}
void Vector_subtractvector(Vector vector1, Vector vector2, unsigned int length) {
unsigned int i;
#pragma ivdep
for (i = 0; i < length; i++)
vector1[i] -= vector2[i];
}
/* Linear Algebra Operations */
real Vector_dot(Vector vector1, Vector vector2, unsigned int length) {
unsigned int i;
real dot = (real)0;
#pragma ivdep
for (i = 0; i < length; i++)
dot += vector1[i] * vector2[i];
return dot;
}
real Vector_norm(Vector vector, unsigned int length) {
unsigned int i;
real norm = (real)0;
#pragma ivdep
for (i = 0; i < length; i++)
norm += vector[i] * vector[i];
norm = sqrt(norm);
return norm;
}
void Vector_normalize(Vector vector, unsigned int length) {
Vector_scale(vector, (real)1 / Vector_norm(vector, length), length);
}
void Vector_writefile(char *filename, Vector vector, unsigned int length) {
unsigned int i;
FILE *file = NULL;
file = fopen(filename, "w");
for (i = 0; i < length; i++)
fprintf(file, "%20.15e\n", vector[i]);
fclose(file);
}
void Vector_pointwisescale(Vector dest, Vector scalefactors, unsigned int length) {
unsigned int i;
for (i = 0; i < length; i++) {
dest[i] *= scalefactors[i];
}
}