static void *mtx_ones_new(t_symbol *s, int argc, t_atom *argv) { t_matrix *x = (t_matrix *)pd_new(mtx_ones_class); int col=0, row=0; outlet_new(&x->x_obj, 0); x->row = x->col = 0; x->atombuffer = 0; switch(argc) { case 0: break; case 1: col=row=atom_getfloat(argv); break; default: row=atom_getfloat(argv++); col=atom_getfloat(argv); } if(col<0) { col=0; } if(row<0) { row=0; } if (col*row) { x->atombuffer = (t_atom *)getbytes((col*row+2)*sizeof(t_atom)); setdimen(x, row, col); matrix_set(x, 1); } return (x); }
static void *mtx_eye_new(t_symbol *s, int argc, t_atom *argv) { t_matrix *x = (t_matrix *)pd_new(mtx_eye_class); int col=0, row=0; outlet_new(&x->x_obj, 0); x->row = x->col = 0; x->atombuffer = 0; switch(argc) { case 0: break; case 1: col=row=atom_getfloat(argv); break; default: row=atom_getfloat(argv++); col=atom_getfloat(argv); } if(col<0)col=0; if(row<0)row=0; if (col*row){ int n = (col<row)?col:row; x->atombuffer = (t_atom *)getbytes((col*row+2)*sizeof(t_atom)); setdimen(x, row, col); matrix_set(x, 0); while(n--)SETFLOAT(x->atombuffer+2+n*(1+col), 1); } return (x); }
static void mtx_transpose_matrix(t_matrix *x, t_symbol *s, int argc, t_atom *argv) { int row, col; t_atom *ap; int r, c; if(iemmatrix_check(x, argc, argv, 0))return; row=atom_getint(argv+0); col=atom_getint(argv+1); if (col*row!=x->col*x->row) { freebytes(x->atombuffer, (x->col*x->row+2)*sizeof(t_atom)); x->atombuffer = (t_atom *)getbytes((row*col+2)*sizeof(t_atom)); } ap = x->atombuffer+2; setdimen(x, col, row); r = row; while(r--) { c=col; while(c--) { t_float f = atom_getfloat(argv+2+r*col+c); SETFLOAT(ap+c*row+r, f); } } matrix_bang(x); }
void mtx_bin_matrix2(t_mtx_binmtx *x, t_symbol *s, int argc, t_atom *argv) { int row = atom_getfloat(argv); int col = atom_getfloat(argv+1); if (argc<2){post("mtx_bin2: crippled matrix"); return;} if ((col<1)||(row<1)) {post("mtx_bin2: invalid dimensions %dx%d", row,col); return;} if (col*row+2>argc){ post("mtx_bin2: sparse matrix not yet supported : use \"mtx_check\""); return;} if (row*col!=x->m2.row*x->m2.col) { freebytes(x->m2.atombuffer, (x->m2.row*x->m2.col+2)*sizeof(t_atom)); x->m2.atombuffer=copybytes(argv,(row*col+2)*sizeof(t_atom)); }else memcpy(x->m2.atombuffer, argv, (row*col+2)*sizeof(t_atom)); setdimen(&x->m2, row, col); }
static void *mtx_diag_new(t_symbol *s, int argc, t_atom *argv) { t_matrix *x = (t_matrix *)pd_new(mtx_diag_class); outlet_new(&x->x_obj, 0); x->row = x->col = 0; x->atombuffer = 0; if(!argc) { return(x); } x->atombuffer = (t_atom *)getbytes((argc*argc+2)*sizeof(t_atom)); setdimen(x, argc, argc); matrix_set(x, 0); argv+=argc-1; while(argc--) { SETFLOAT(x->atombuffer+2+argc*(1+x->col), atom_getfloat(argv--)); } return (x); }
static void mtx_resize_matrix(t_matrix *x, t_symbol *s, int argc, t_atom *argv) { int row=atom_getfloat(argv); int col=atom_getfloat(argv+1); int r = x->current_row, c = x->current_col; int R=0, ROW, COL; if (argc<2) { post("mtx_add: crippled matrix"); return; } if ((col<1)||(row<1)) { post("mtx_add: invalid dimensions"); return; } if (col*row>argc-2) { post("sparse matrix not yet supported : use \"mtx_check\""); return; } if (!r)r=row; if (!c)c=col; if (r==row && c==col) { /* no need to change */ outlet_anything(x->x_obj.ob_outlet, gensym("matrix"), argc, argv); return; } x->atombuffer=(t_atom *)getbytes((c*r+2)*sizeof(t_atom)); setdimen(x, r, c); matrix_set(x, 0); ROW=(r<row)?r:row; COL=(c<col)?c:col; R=ROW; while(R--)memcpy(x->atombuffer+2+(ROW-R-1)*c, argv+2+(ROW-R-1)*col, COL*sizeof(t_atom)); matrix_bang(x); freebytes(x->atombuffer, (c*r+2)*sizeof(t_atom)); }