Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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);
}
Esempio n. 5
0
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);
}
Esempio n. 6
0
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));
}