コード例 #1
0
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);
}
コード例 #2
0
ファイル: mtx_cumsum.c プロジェクト: Angeldude/pd
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);
}