[PD-cvs] externals/iem/iemmatrix/src mtx_binops.c,1.1.1.1,1.2

IOhannes m zmölnig zmoelnig at users.sourceforge.net
Wed Mar 30 14:12:35 CEST 2005


Update of /cvsroot/pure-data/externals/iem/iemmatrix/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8154

Modified Files:
	mtx_binops.c 
Log Message:
added [mtx_.^]


Index: mtx_binops.c
===================================================================
RCS file: /cvsroot/pure-data/externals/iem/iemmatrix/src/mtx_binops.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** mtx_binops.c	21 Mar 2005 14:33:31 -0000	1.1.1.1
--- mtx_binops.c	30 Mar 2005 12:12:33 -0000	1.2
***************
*** 26,46 ****
  /* matrix math */
  
- typedef struct _mtx_binscalar
- {
-   t_object x_obj;
- 
-   t_matrix m; // the output matrix
-   t_float f;  // the second input
- } t_mtx_binscalar;
- 
- typedef struct _mtx_binmtx
- {
-   t_object x_obj;
  
!   t_matrix m;  // the output matrix
!   t_matrix m2; // the second input
! } t_mtx_binmtx;
! 
! static void mtx_bin_matrix2(t_mtx_binmtx *x, t_symbol *s, int argc, t_atom *argv)
  {
    int row = atom_getfloat(argv);
--- 26,31 ----
  /* matrix math */
  
  
! void mtx_bin_matrix2(t_mtx_binmtx *x, t_symbol *s, int argc, t_atom *argv)
  {
    int row = atom_getfloat(argv);
***************
*** 57,61 ****
  }
  
! static void mtx_binmtx_bang(t_mtx_binmtx *x)
  {
    if((&x->m)&&(x->m.atombuffer))
--- 42,46 ----
  }
  
! void mtx_binmtx_bang(t_mtx_binmtx *x)
  {
    if((&x->m)&&(x->m.atombuffer))
***************
*** 64,78 ****
  
  
! static void mtx_binmtx_free(t_mtx_binmtx *x)
  {
    matrix_free(&x->m);
    matrix_free(&x->m2);
  }
! static void mtx_binscalar_bang(t_mtx_binscalar *x)
  {
    if((&x->m)&&(x->m.atombuffer))
      outlet_anything(x->x_obj.ob_outlet, gensym("matrix"), x->m.col*x->m.row+2, x->m.atombuffer);
  }
! static void mtx_binscalar_free(t_mtx_binscalar *x)
  {
    matrix_free(&x->m);
--- 49,63 ----
  
  
! void mtx_binmtx_free(t_mtx_binmtx *x)
  {
    matrix_free(&x->m);
    matrix_free(&x->m2);
  }
! void mtx_binscalar_bang(t_mtx_binscalar *x)
  {
    if((&x->m)&&(x->m.atombuffer))
      outlet_anything(x->x_obj.ob_outlet, gensym("matrix"), x->m.col*x->m.row+2, x->m.atombuffer);
  }
! void mtx_binscalar_free(t_mtx_binscalar *x)
  {
    matrix_free(&x->m);
***************
*** 668,671 ****
--- 653,791 ----
  }
  
+ 
+ /* mtx_pow */
+ static t_class *mtx_powelement_class, *mtx_powscalar_class;
+ 
+ static void mtx_powelement_matrix(t_mtx_binmtx *x, t_symbol *s, int argc, t_atom *argv)
+ {
+   int row=atom_getfloat(argv++);
+   int col=atom_getfloat(argv++);
+   t_atom *m;
+   t_atom *m2 = x->m2.atombuffer+2;
+   int n = argc-2;
+ 
+   if (argc<2){    post("mtx_pow: crippled matrix");    return;  }
+   if ((col<1)||(row<1)) {    post("mtx_pow: invalid dimensions");    return;  }
+   if (col*row>argc-2){    post("sparse matrix not yet supported : use \"mtx_check\"");    return;  }
+   if (!(x->m2.col*x->m2.row)) {
+     adjustsize(&x->m, row, col);
+     matrix_set(&x->m, 0);
+     outlet_anything(x->x_obj.ob_outlet, gensym("matrix"), argc, x->m.atombuffer);
+     return;
+   }
+   if ((col!=x->m2.col)||(row!=x->m2.row)){    post("matrix dimension do not match");    /* LATER SOLVE THIS */    return;  }
+ 
+   adjustsize(&x->m, row, col);
+   m =  x->m.atombuffer+2;
+ 
+   while(n--){
+     t_float f = powf(atom_getfloat(argv++),atom_getfloat(m2++));
+     SETFLOAT(m, f);
+     m++;
+   }
+ 
+   outlet_anything(x->x_obj.ob_outlet, gensym("matrix"), argc, x->m.atombuffer);
+ }
+ static void mtx_powelement_float(t_mtx_binmtx *x, t_float f)
+ {
+   t_matrix *m=&x->m, *m2=&x->m2;
+   t_atom *ap, *ap2=m2->atombuffer+2;
+   int row2, col2, n;
+ 
+   if (!m2->atombuffer){ post("power by what ?");            return; }
+ 
+   row2=atom_getfloat(m2->atombuffer);
+   col2=atom_getfloat(m2->atombuffer+1);
+   adjustsize(m, row2, col2);
+   ap=m->atombuffer+2;
+ 
+   n=row2*col2;
+ 
+   while(n--){
+     SETFLOAT(ap, powf(f,atom_getfloat(ap2++)));
+     ap++;
+   }
+   
+   outlet_anything(x->x_obj.ob_outlet, gensym("matrix"), m->row*m->col+2, m->atombuffer);
+ }
+ static void mtx_powscalar_matrix(t_mtx_binscalar *x, t_symbol *s, int argc, t_atom *argv)
+ {
+   int n=argc-2;
+   t_atom *m;
+   t_float factor = x->f;
+   int row=atom_getfloat(argv++);
+   int col=atom_getfloat(argv++);
+ 
+   if (argc<2){
+     post("mtx_pow: crippled matrix");
+     return;
+   }
+   adjustsize(&x->m, row, col);
+   m = x->m.atombuffer+2;
+ 
+   while(n--){
+     m->a_type = A_FLOAT;
+     (m++)->a_w.w_float = powf(atom_getfloat(argv++),factor);
+   }
+ 
+   outlet_anything(x->x_obj.ob_outlet, gensym("matrix"), argc, x->m.atombuffer);
+ }
+ static void mtx_powscalar_list(t_mtx_binscalar *x, t_symbol *s, int argc, t_atom *argv)
+ {
+   int n=argc;
+   t_atom *m;
+   t_float factor = x->f;
+ 
+   adjustsize(&x->m, 1, argc);
+   m = x->m.atombuffer;
+ 
+   while(n--){
+     m->a_type = A_FLOAT;
+     (m++)->a_w.w_float = powf(atom_getfloat(argv++),factor);
+   }
+ 
+   outlet_list(x->x_obj.ob_outlet, gensym("list"), argc, x->m.atombuffer);
+ }
+ 
+ static void *mtx_pow_new(t_symbol *s, int argc, t_atom *argv)
+ {
+   if (argc>1) post("mtx_pow : extra arguments ignored");
+   if (argc) {
+     /* scalar powision */
+     t_mtx_binscalar *x = (t_mtx_binscalar *)pd_new(mtx_powscalar_class);
+     floatinlet_new(&x->x_obj, &x->f);
+     x->f = atom_getfloatarg(0, argc, argv);
+     outlet_new(&x->x_obj, 0);
+     return(x);
+   } else {
+     /* element powision */
+     t_matrix *x = (t_matrix *)pd_new(mtx_powelement_class);
+     inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("matrix"), gensym(""));
+     outlet_new(&x->x_obj, 0);
+     x->col = x->row = 0;
+     x->atombuffer = 0;
+     return(x);
+   }
+ }
+ 
+ static void mtx_pow_setup(void)
+ {
+   mtx_powelement_class = class_new(gensym("mtx_.^"), (t_newmethod)mtx_pow_new, (t_method)mtx_binmtx_free,
+ 				   sizeof(t_mtx_binmtx), 0, A_GIMME, 0);
+   class_addmethod(mtx_powelement_class, (t_method)mtx_powelement_matrix, gensym("matrix"), A_GIMME, 0);
+   class_addmethod(mtx_powelement_class, (t_method)mtx_bin_matrix2, gensym(""), A_GIMME, 0);
+   class_addfloat (mtx_powelement_class, mtx_powelement_float);
+   class_addbang  (mtx_powelement_class, mtx_binmtx_bang);
+ 
+   mtx_powscalar_class = class_new(gensym("mtx_.^"), 0, (t_method)mtx_binscalar_free,
+ 				  sizeof(t_mtx_binscalar), 0, 0);
+   class_addmethod(mtx_powscalar_class, (t_method)mtx_powscalar_matrix, gensym("matrix"), A_GIMME, 0);
+   class_addlist  (mtx_powscalar_class, mtx_powscalar_list);
+   class_addbang  (mtx_powscalar_class, mtx_binscalar_bang);
+ 
+   class_sethelpsymbol(mtx_powelement_class, gensym("iemmatrix/mtx_binops"));
+   class_sethelpsymbol(mtx_powscalar_class, gensym("iemmatrix/mtx_binops"));
+ }
+ 
  void mtx_binops_setup(void)
  {
***************
*** 674,677 ****
--- 794,799 ----
    mtx_mul_setup();
    mtx_div_setup();
+   mtx_pow_setup();
+ 
  }
  void iemtx_binops_setup(void)





More information about the Pd-cvs mailing list