static void mTXCumsumMatrix (MTXCumsum *mtx_cumsum_obj, t_symbol *s, int argc, t_atom *argv) { int rows, columns, size; t_atom *list_ptr = argv+2; t_atom *list_out = mtx_cumsum_obj->list_out; t_float *x = mtx_cumsum_obj->x; t_float *y = mtx_cumsum_obj->y; int count; /* size check */ if(iemmatrix_check(mtx_cumsum_obj, argc, argv, 0))return; rows = atom_getint (argv+0); columns = atom_getint (argv+1); size = rows * columns; if ((!x)||(!list_out)||(!y)) { if (!x) { x = (t_float *) getbytes (sizeof (t_float) * (size)); } if (!y) { y = (t_float *) getbytes (sizeof (t_float) * (size)); } if (!list_out) { list_out = (t_atom *) getbytes (sizeof (t_atom) * (size+2)); } } else if (size != mtx_cumsum_obj->size) { x = (t_float *) resizebytes (x, sizeof (t_float) * (mtx_cumsum_obj->size), sizeof (t_float) * (size)); y = (t_float *) resizebytes (y, sizeof (t_float) * (mtx_cumsum_obj->size), sizeof (t_float) * (size)); list_out = (t_atom *) resizebytes (list_out, sizeof (t_atom) * (mtx_cumsum_obj->size+2), sizeof (t_atom) * (size + 2)); } mtx_cumsum_obj->size = size; mtx_cumsum_obj->rows = rows; mtx_cumsum_obj->columns = columns; mtx_cumsum_obj->list_out = list_out; mtx_cumsum_obj->x = x; mtx_cumsum_obj->y = y; /* main part */ /* reading matrix from inlet */ if ((mtx_cumsum_obj->cumsum_mode == col_sym) || (mtx_cumsum_obj->cumsum_mode == col_sym2)) { readFloatFromListModulo (size, columns, list_ptr, x); columns = mtx_cumsum_obj->rows; rows = mtx_cumsum_obj->columns; } else { readFloatFromList (size, list_ptr, x); } /* calculating cumsum */ if (mtx_cumsum_obj->cumsum_direction == -1) { if ((mtx_cumsum_obj->cumsum_mode == row_sym) || (mtx_cumsum_obj->cumsum_mode == col_sym) || (mtx_cumsum_obj->cumsum_mode == col_sym2)) { x += columns-1; y += columns-1; for (count = rows; count--; x += columns, y += columns) { cumSumReverse (columns,x,y); } } else { x += size-1; y += size-1; cumSumReverse (size, x, y); } } else if ((mtx_cumsum_obj->cumsum_mode == row_sym) || (mtx_cumsum_obj->cumsum_mode == col_sym) || (mtx_cumsum_obj->cumsum_mode == col_sym2)) for (count = rows; count--; x += columns, y += columns) { cumSum (columns,x,y); } else { cumSum (size, x, y); } x = mtx_cumsum_obj->x; y = mtx_cumsum_obj->y; /* writing matrix to outlet */ if ((mtx_cumsum_obj->cumsum_mode == col_sym) || (mtx_cumsum_obj->cumsum_mode == col_sym2)) { columns = mtx_cumsum_obj->columns; rows = mtx_cumsum_obj->rows; writeFloatIntoListModulo (size, columns, list_out+2, y); } else { writeFloatIntoList (size, list_out+2, y); } SETSYMBOL(list_out, gensym("matrix")); SETFLOAT(list_out, rows); SETFLOAT(&list_out[1], columns); outlet_anything(mtx_cumsum_obj->list_outlet, gensym("matrix"), mtx_cumsum_obj->size+2, list_out); }
static void mTXCumsumMatrix (MTXCumsum *mtx_cumsum_obj, t_symbol *s, int argc, t_atom *argv) { int rows = atom_getint (argv++); int columns = atom_getint (argv++); int size = rows * columns; int list_size = argc - 2; t_atom *list_ptr = argv; t_atom *list_out = mtx_cumsum_obj->list_out; t_float *x = mtx_cumsum_obj->x; t_float *y = mtx_cumsum_obj->y; int count; /* size check */ if (!size) { post("mtx_cumsum: invalid dimensions"); return; } else if (list_size<size) { post("mtx_cumsum: sparse matrix not yet supported: use \"mtx_check\""); return; } else if ((!x)||(!list_out)||(!y)) { if (!x) x = (t_float *) getbytes (sizeof (t_float) * (size)); if (!y) y = (t_float *) getbytes (sizeof (t_float) * (size)); if (!list_out) list_out = (t_atom *) getbytes (sizeof (t_atom) * (size+2)); } else if (size != mtx_cumsum_obj->size) { x = (t_float *) resizebytes (x, sizeof (t_float) * (mtx_cumsum_obj->size), sizeof (t_float) * (size)); y = (t_float *) resizebytes (y, sizeof (t_float) * (mtx_cumsum_obj->size), sizeof (t_float) * (size)); list_out = (t_atom *) resizebytes (list_out, sizeof (t_atom) * (mtx_cumsum_obj->size+2), sizeof (t_atom) * (size + 2)); } mtx_cumsum_obj->size = size; mtx_cumsum_obj->rows = rows; mtx_cumsum_obj->columns = columns; mtx_cumsum_obj->list_out = list_out; mtx_cumsum_obj->x = x; mtx_cumsum_obj->y = y; /* main part */ /* reading matrix from inlet */ if ((mtx_cumsum_obj->cumsum_mode == col_sym) || (mtx_cumsum_obj->cumsum_mode == col_sym2)) { readFloatFromListModulo (size, columns, list_ptr, x); columns = mtx_cumsum_obj->rows; rows = mtx_cumsum_obj->columns; } else readFloatFromList (size, list_ptr, x); /* calculating cumsum */ if (mtx_cumsum_obj->cumsum_direction == -1) { if ((mtx_cumsum_obj->cumsum_mode == row_sym) || (mtx_cumsum_obj->cumsum_mode == col_sym) || (mtx_cumsum_obj->cumsum_mode == col_sym2)) { x += columns-1; y += columns-1; for (count = rows; count--; x += columns, y += columns) cumSumReverse (columns,x,y); } else { x += size-1; y += size-1; cumSumReverse (size, x, y); } } else if ((mtx_cumsum_obj->cumsum_mode == row_sym) || (mtx_cumsum_obj->cumsum_mode == col_sym) || (mtx_cumsum_obj->cumsum_mode == col_sym2)) for (count = rows; count--; x += columns, y += columns) cumSum (columns,x,y); else cumSum (size, x, y); x = mtx_cumsum_obj->x; y = mtx_cumsum_obj->y; /* writing matrix to outlet */ if ((mtx_cumsum_obj->cumsum_mode == col_sym) || (mtx_cumsum_obj->cumsum_mode == col_sym2)) { columns = mtx_cumsum_obj->columns; rows = mtx_cumsum_obj->rows; writeFloatIntoListModulo (size, columns, list_out+2, y); } else writeFloatIntoList (size, list_out+2, y); SETSYMBOL(list_out, gensym("matrix")); SETFLOAT(list_out, rows); SETFLOAT(&list_out[1], columns); outlet_anything(mtx_cumsum_obj->list_outlet, gensym("matrix"), mtx_cumsum_obj->size+2, list_out); }