diff options
-rw-r--r-- | src/iemmatrix.c | 2 | ||||
-rw-r--r-- | src/mtx_prod.c | 2 | ||||
-rw-r--r-- | src/mtx_sum.c | 72 |
3 files changed, 75 insertions, 1 deletions
diff --git a/src/iemmatrix.c b/src/iemmatrix.c index 7d4933b..6621e87 100644 --- a/src/iemmatrix.c +++ b/src/iemmatrix.c @@ -37,6 +37,7 @@ void mtx_roll_setup(); void mtx_row_setup(); void mtx_scroll_setup(); void mtx_size_setup(); +void mtx_sum_setup(); void mtx_trace_setup(); void mtx_transpose_setup(); void mtx_zeros_setup(); @@ -67,6 +68,7 @@ void iemtx_setup(){ mtx_row_setup(); mtx_scroll_setup(); mtx_size_setup(); + mtx_sum_setup(); mtx_trace_setup(); mtx_transpose_setup(); mtx_zeros_setup(); diff --git a/src/mtx_prod.c b/src/mtx_prod.c index d6c7a15..82ecf32 100644 --- a/src/mtx_prod.c +++ b/src/mtx_prod.c @@ -14,7 +14,7 @@ #include "iemmatrix.h" /* mtx_prod */ -/* prod(diag(A)) +/* column-wise product */ static t_class *mtx_prod_class; static void mtx_prod_matrix(t_matrix *x, t_symbol *s, int argc, t_atom *argv) diff --git a/src/mtx_sum.c b/src/mtx_sum.c new file mode 100644 index 0000000..d2a6d34 --- /dev/null +++ b/src/mtx_sum.c @@ -0,0 +1,72 @@ +/* + * iemmatrix + * + * objects for manipulating simple matrices + * mostly refering to matlab/octave matrix functions + * + * Copyright (c) IOhannes m zmölnig, forum::für::umläute + * IEM, Graz, Austria + * + * For information on usage and redistribution, and for a DISCLAIMER OF ALL + * WARRANTIES, see the file, "LICENSE.txt," in this distribution. + * + */ +#include "iemmatrix.h" + +/* mtx_sum */ +/* column-wise sum + */ +static t_class *mtx_sum_class; +static void mtx_sum_matrix(t_matrix *x, t_symbol *s, int argc, t_atom *argv) +{ + int row=atom_getfloat(argv++); + int col=atom_getfloat(argv++); + int n; + + if(row*col>argc-2)post("mtx_sum: sparse matrices not yet supported : use \"mtx_check\""); + else { + t_atom *ap = (t_atom *)getbytes(col * sizeof(t_atom)), *dummy=ap; + + for(n=0;n<col;n++, dummy++){ + int i=row; + t_float f=0.f; + t_atom*ap2=argv+n; + while(i--){ + f+=atom_getfloat(ap2+col*i); + } + SETFLOAT(dummy, f); + } + + outlet_list(x->x_obj.ob_outlet, gensym("prod"), col, ap); + + freebytes(ap, (col * sizeof(t_atom))); + } +} +static void mtx_sum_list(t_matrix *x, t_symbol *s, int argc, t_atom *argv){ + t_float f=0.f; + while(argc--)f+=atom_getfloat(argv++); + outlet_float(x->x_obj.ob_outlet, f); +} + + +static void *mtx_sum_new() +{ + t_matrix *x = (t_matrix *)pd_new(mtx_sum_class); + outlet_new(&x->x_obj, 0); + x->row = x->col = 0; + x->atombuffer = 0; + + return (x); +} +void mtx_sum_setup(void) +{ + mtx_sum_class = class_new(gensym("mtx_sum"), (t_newmethod)mtx_sum_new, + (t_method)matrix_free, sizeof(t_matrix), 0, A_GIMME, 0); + class_addlist (mtx_sum_class, mtx_sum_list); + // class_addbang (mtx_sum_class, matrix_bang); + class_addmethod(mtx_sum_class, (t_method)mtx_sum_matrix, gensym("matrix"), A_GIMME, 0); + class_sethelpsymbol(mtx_sum_class, gensym("iemmatrix/mtx_sum")); +} +void iemtx_sum_setup(void){ + void mtx_sum_setup(void); +} |