[PD-cvs] externals/iem/iemmatrix/src iemmatrix_utility.c, 1.1, 1.2 mtx_inverse.c, 1.8, 1.9 mtx_mul.c, 1.5, 1.6 mtx_transpose.c, 1.5, 1.6

Georg Holzmann grholzi at users.sourceforge.net
Mon Jan 15 21:06:44 CET 2007


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

Modified Files:
	iemmatrix_utility.c mtx_inverse.c mtx_mul.c mtx_transpose.c 
Log Message:
small fix


Index: mtx_transpose.c
===================================================================
RCS file: /cvsroot/pure-data/externals/iem/iemmatrix/src/mtx_transpose.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** mtx_transpose.c	29 Mar 2006 12:07:52 -0000	1.5
--- mtx_transpose.c	15 Jan 2007 20:06:42 -0000	1.6
***************
*** 17,34 ****
  static t_class *mtx_transpose_class;
  
- t_matrixfloat*mtx_doTranspose(t_matrixfloat*transposee, int row, int col){
-   int r,c;
-   t_matrixfloat*transposed=0;
-   if(!transposee||!row||!col)return 0;
-   transposed=(t_matrixfloat*)getbytes(sizeof(t_matrixfloat)*row*col);
-   r=row;
-   while(r--){
-     c=col;
-     while(c--)
-       transposed[c*row+r]=transposee[r*col+c];
-   }
-   return transposed;
- }
- 
  static void mtx_transpose_matrix(t_matrix *x, t_symbol *s, int argc, t_atom *argv)
  {
--- 17,20 ----

Index: mtx_inverse.c
===================================================================
RCS file: /cvsroot/pure-data/externals/iem/iemmatrix/src/mtx_inverse.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** mtx_inverse.c	12 Nov 2006 12:56:06 -0000	1.8
--- mtx_inverse.c	15 Jan 2007 20:06:42 -0000	1.9
***************
*** 17,86 ****
  static t_class *mtx_inverse_class;
  
- 
- t_matrixfloat* mtx_doInvert(t_matrixfloat*input, int rowcol, int*err){
-   /*
-    * row==col==rowclo
-    * input=t_matrixfloat[row*col]
-    * output=t_matrixfloat[row*col]
-    */
-   int i, k;
-   t_matrixfloat *a1, *b1, *a2, *b2;
- 
-   int ok=0; /* error counter */
- 
-   int col=rowcol, row=rowcol, row2=row*col;
-   t_matrixfloat *original=input;
-   t_matrixfloat *inverted = 0;
- 
-   if(input==0)return 0;
- 
-   /* 1a reserve space for the inverted matrix */
-   inverted=(t_matrixfloat *)getbytes(sizeof(t_matrixfloat)*row2);
-   if(inverted==0)return 0;
- 
-   /* 1b make an eye-shaped float-buf for B */
-   i=row2;
-   b1=inverted;
-   while(i--)*b1++=0;
-   i=row;
-   b1=inverted;
-   while(i--)b1[i*(row+1)]=1;
- 
-   /* 2. do the Gauss-Jordan */
-   for (k=0;k<row;k++) {
-     /* adjust current row */
-     t_matrixfloat diagel = original[k*(col+1)];
-     t_matrixfloat i_diagel = diagel?1./diagel:0;
-     if (!diagel)ok++;
- 
-     /* normalize current row (set the diagonal-element to 1 */
-     a2=original+k*col;
-     b2=inverted+k*col;
-     i=row;
-     while(i--){
-       *a2++*=i_diagel;
-       *b2++*=i_diagel;
-     }
- 
-     /* eliminate the k-th element in each row by adding the weighted normalized row */
-     a2=original+k*row;
-     b2=inverted+k*row;
-     for(i=0;i<row;i++)
-       if (i-k) {
-         t_matrixfloat f=-*(original+i*row+k);
-         int j = row;
-         a1=original+i*row;
-         b1=inverted+i*row;
-         while (j--) {
-           *(a1+j)+=f**(a2+j);
-           *(b1+j)+=f**(b2+j);
-         }
-       }
-   }
-   if(err!=0)*err=ok;
- 
-   return inverted;
- }
- 
  static void mtx_inverse_matrix(t_matrix *x, t_symbol *s, int argc, t_atom *argv)
  {
--- 17,20 ----

Index: mtx_mul.c
===================================================================
RCS file: /cvsroot/pure-data/externals/iem/iemmatrix/src/mtx_mul.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** mtx_mul.c	25 Jul 2006 14:15:22 -0000	1.5
--- mtx_mul.c	15 Jan 2007 20:06:42 -0000	1.6
***************
*** 24,44 ****
  */
  
- t_matrixfloat*mtx_doMultiply(int rowA, t_matrixfloat*A, int colArowB, t_matrixfloat*B, int colB){
-   t_matrixfloat*result=0;
-   int r, c, n;
- 
-   if(!A || !B || !rowA || !colArowB || !colB)return 0;
-   result=(t_matrixfloat*)getbytes(sizeof(t_matrixfloat)*rowA*colB);
- 
-   for(r=0; r<rowA; r++){
-     for(c=0; c<colB; c++){
-       t_matrixfloat sum=0.f;
-       for(n=0;n<colArowB; n++)
-         sum+=A[colArowB*r+n]*B[colB*n+c];
-       result[colB*r+c]=sum;
-     }
-   }
-   return result;
- }
  
  /* mtx_mul */
--- 24,27 ----

Index: iemmatrix_utility.c
===================================================================
RCS file: /cvsroot/pure-data/externals/iem/iemmatrix/src/iemmatrix_utility.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** iemmatrix_utility.c	11 Jan 2007 19:41:20 -0000	1.1
--- iemmatrix_utility.c	15 Jan 2007 20:06:42 -0000	1.2
***************
*** 417,418 ****
--- 417,522 ----
    x->col=x->row=0;
  }
+ 
+ 
+ /* some math */
+ 
+ /*  invert a square matrix (row=col=rowcol) */
+ /* if "error" is non-NULL, it's content will be set to 0 if the matrix was invertable, else to non-0 */
+ t_matrixfloat* mtx_doInvert(t_matrixfloat*input, int rowcol, int*err){
+   /*
+    * row==col==rowclo
+    * input=t_matrixfloat[row*col]
+    * output=t_matrixfloat[row*col]
+    */
+   int i, k;
+   t_matrixfloat *a1, *b1, *a2, *b2;
+ 
+   int ok=0; /* error counter */
+ 
+   int col=rowcol, row=rowcol, row2=row*col;
+   t_matrixfloat *original=input;
+   t_matrixfloat *inverted = 0;
+ 
+   if(input==0)return 0;
+ 
+   /* 1a reserve space for the inverted matrix */
+   inverted=(t_matrixfloat *)getbytes(sizeof(t_matrixfloat)*row2);
+   if(inverted==0)return 0;
+ 
+   /* 1b make an eye-shaped float-buf for B */
+   i=row2;
+   b1=inverted;
+   while(i--)*b1++=0;
+   i=row;
+   b1=inverted;
+   while(i--)b1[i*(row+1)]=1;
+ 
+   /* 2. do the Gauss-Jordan */
+   for (k=0;k<row;k++) {
+     /* adjust current row */
+     t_matrixfloat diagel = original[k*(col+1)];
+     t_matrixfloat i_diagel = diagel?1./diagel:0;
+     if (!diagel)ok++;
+ 
+     /* normalize current row (set the diagonal-element to 1 */
+     a2=original+k*col;
+     b2=inverted+k*col;
+     i=row;
+     while(i--){
+       *a2++*=i_diagel;
+       *b2++*=i_diagel;
+     }
+ 
+     /* eliminate the k-th element in each row by adding the weighted normalized row */
+     a2=original+k*row;
+     b2=inverted+k*row;
+     for(i=0;i<row;i++)
+       if (i-k) {
+         t_matrixfloat f=-*(original+i*row+k);
+         int j = row;
+         a1=original+i*row;
+         b1=inverted+i*row;
+         while (j--) {
+           *(a1+j)+=f**(a2+j);
+           *(b1+j)+=f**(b2+j);
+         }
+       }
+   }
+   if(err!=0)*err=ok;
+ 
+   return inverted;
+ }
+ 
+ /*  transpose a matrix */
+ t_matrixfloat*mtx_doTranspose(t_matrixfloat*transposee, int row, int col){
+   int r,c;
+   t_matrixfloat*transposed=0;
+   if(!transposee||!row||!col)return 0;
+   transposed=(t_matrixfloat*)getbytes(sizeof(t_matrixfloat)*row*col);
+   r=row;
+   while(r--){
+     c=col;
+     while(c--)
+       transposed[c*row+r]=transposee[r*col+c];
+   }
+   return transposed;
+ }
+ 
+ /*  multiply matrix A=[rowA*colA] with matrix B=[rowB*colB]; C=A*B; colA=rowB=colArowB */
+ t_matrixfloat*mtx_doMultiply(int rowA, t_matrixfloat*A, int colArowB, t_matrixfloat*B, int colB){
+   t_matrixfloat*result=0;
+   int r, c, n;
+ 
+   if(!A || !B || !rowA || !colArowB || !colB)return 0;
+   result=(t_matrixfloat*)getbytes(sizeof(t_matrixfloat)*rowA*colB);
+ 
+   for(r=0; r<rowA; r++){
+     for(c=0; c<colB; c++){
+       t_matrixfloat sum=0.f;
+       for(n=0;n<colArowB; n++)
+         sum+=A[colArowB*r+n]*B[colB*n+c];
+       result[colB*r+c]=sum;
+     }
+   }
+   return result;
+ }





More information about the Pd-cvs mailing list