Skip to content

Commit f95b352

Browse files
committed
Merge branch 'main' of github.com:seamplex/feenox
2 parents 9fe6a94 + 6cb5df1 commit f95b352

File tree

5 files changed

+53
-3
lines changed

5 files changed

+53
-3
lines changed

ChangeLog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# Development (current)
2+
3+
* functions `vecmean`, `vecvariance` and `vecsd`
4+
15
# v1.2 (Sep 2025)
26

37
* VTK/VTU writer now supports sparse or unsorted node tags

src/feenox.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ extern "C++" {
131131
// number of internal functions, functional and vector functions
132132
#define N_BUILTIN_FUNCTIONS 70
133133
#define N_BUILTIN_FUNCTIONALS 8
134-
#define N_BUILTIN_VECTOR_FUNCTIONS 8
134+
#define N_BUILTIN_VECTOR_FUNCTIONS 11
135135

136136
// no son enums porque hacemos operaciones con las mascaras de abajo
137137
#define EXPR_UNDEFINED 0
@@ -470,15 +470,14 @@ struct vector_t {
470470
int used;
471471
int assigned_init;
472472
int assigned_zero;
473-
473+
474474
expr_t size_expr;
475475
int size;
476476

477477
gsl_vector *value;
478478
gsl_vector *initial_transient;
479479
gsl_vector *initial_static;
480480

481-
482481
// linked list with the expressions of the initial elements
483482
expr_t *datas;
484483

src/math/builtin_vectorfunctions.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ double feenox_builtin_vecminindex(vector_t **);
3030
double feenox_builtin_vecmaxindex(vector_t **);
3131
double feenox_builtin_vecsum(vector_t **);
3232
double feenox_builtin_vecsize(vector_t **);
33+
double feenox_builtin_vecmean(vector_t **);
34+
double feenox_builtin_vecvariance(vector_t **);
35+
double feenox_builtin_vecsd(vector_t **);
3336

3437

3538
struct builtin_vectorfunction_t builtin_vectorfunction[N_BUILTIN_VECTOR_FUNCTIONS] = {
@@ -41,6 +44,9 @@ struct builtin_vectorfunction_t builtin_vectorfunction[N_BUILTIN_VECTOR_FUNCTION
4144
{"vecminindex", 1, 1, &feenox_builtin_vecminindex},
4245
{"vecmaxindex", 1, 1, &feenox_builtin_vecmaxindex},
4346
{"vecsum", 1, 1, &feenox_builtin_vecsum},
47+
{"vecmean", 1, 1, &feenox_builtin_vecmean},
48+
{"vecvariance", 1, 1, &feenox_builtin_vecvariance},
49+
{"vecsd", 1, 1, &feenox_builtin_vecsd},
4450
};
4551

4652
///fv+vecsize+usage vecsize(b)
@@ -188,3 +194,39 @@ double feenox_builtin_vecdot(vector_t **arg) {
188194
return s;
189195
}
190196

197+
///fv+vecmean+usage vecmean(a)
198+
///fv+vecmean+math \hat{\vec{a}} = \frac{1}{\text{vecsize}(\vec{a})} \cdot \sum_{i=1}^{\text{vecsize}(\vec{a})} a_i
199+
///fv+vecmean+desc Computes the mean value of the elements of vector $\vec{a}$.
200+
double feenox_builtin_vecmean(vector_t **arg) {
201+
202+
if (!arg[0]->initialized) {
203+
feenox_vector_init(arg[0], FEENOX_VECTOR_INITIAL);
204+
}
205+
206+
return gsl_stats_mean(arg[0]->value->data, arg[0]->value->stride, arg[0]->size);
207+
}
208+
209+
///fv+vecvariance+usage vecvariance(a)
210+
///fv+vecvariance+math \hat{\Sigma_\vec{a}} = \frac{1}{\text{vecsize}(\vec{a}) -1} \cdot \sum_{i=1}^{\text{vecsize}(\vec{a})} (a_i - \hat{\vec{a}})^2
211+
///fv+vecvariance+desc Computes the variance of the elements of vector $\vec{a}$.
212+
double feenox_builtin_vecvariance(vector_t **arg) {
213+
214+
if (!arg[0]->initialized) {
215+
feenox_vector_init(arg[0], FEENOX_VECTOR_INITIAL);
216+
}
217+
218+
return gsl_stats_variance(arg[0]->value->data, arg[0]->value->stride, arg[0]->size);
219+
}
220+
221+
///fv+vecsd+usage vecsd(a)
222+
///fv+vecsd+math \sqrt(\hat{\Sigma_\vec{a}}) = \sqrt{\frac{1}{\text{vecsize}(\vec{a}) -1} \cdot \sum_{i=1}^{\text{vecsize}(\vec{a})} (a_i - \hat{\vec{a}})^2}
223+
///fv+vecsd+desc Computes the standar deviation of the elements of vector $\vec{a}$.
224+
///fv+vecsd+desc This is the square root of the variance `vecvariance(a)`.
225+
double feenox_builtin_vecsd(vector_t **arg) {
226+
227+
if (!arg[0]->initialized) {
228+
feenox_vector_init(arg[0], FEENOX_VECTOR_INITIAL);
229+
}
230+
231+
return gsl_stats_sd(arg[0]->value->data, arg[0]->value->stride, arg[0]->size);
232+
}

tests/stats.fee

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
VECTOR r[10] DATA +1 +2 +2 -1 +1 0 +1 +1.5 -1 -1
2+
PRINTF "%.4f %.4f %.4f" vecmean(r) vecvariance(r) vecsd(r)

tests/vector.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,6 @@ exitifwrong $?
1717

1818
answerdiff fibo_vector.fee
1919
exitifwrong $?
20+
21+
answer stats.fee "0.5500 1.4694 1.2122"
22+
exitifwrong $?

0 commit comments

Comments
 (0)