home *** CD-ROM | disk | FTP | other *** search
/ Los Alamos National Laboratory / LANL_CD.ISO / software / compres / src / tpose.c < prev    next >
C/C++ Source or Header  |  1991-11-15  |  1KB  |  68 lines

  1. tpose(x, n, m)
  2. int n, m;
  3. float **x;
  4. {
  5.     if(n == m)
  6.         tpose1(x, n);
  7.     else
  8.         tpose2(x, n, m);
  9. }
  10.  
  11. /****************************************************************/
  12.  
  13. tpose1(a, n)
  14. register int n;
  15. float **a;
  16. {
  17.     float temp;
  18.     register int np1;
  19.     register float *pend, *pij, *pji, *pij_o, *pji_o;
  20.  
  21.     np1 = n + 1;
  22.     pend = *a + n*n;
  23.     pij_o = *a + n;
  24.     pji_o = *a + 1;
  25.     while (pij_o < pend) {
  26.         pij = pij_o;
  27.         pji = pji_o;
  28.         while (pij < pend) {
  29.             temp = *pij;
  30.             *pij = *pji;
  31.             *pji++ = temp;
  32.             pij += n;
  33.     }
  34.         pij_o += np1;
  35.         pji_o += np1;
  36.     }
  37. }
  38.  
  39. /****************************************************************/
  40.  
  41. tpose2(a, n, m)
  42. register int n, m;
  43. float **a;
  44. {
  45.     float *bsave;
  46.     register float *max1, *max2, *aptr, *b, *bptr;
  47.  
  48.     aptr = *a;
  49.     b = bptr = bsave = (float*)malloc(n*m*sizeof(float));
  50.     if(!b) {
  51.         printf("ERROR: Not enough room for malloc\n");
  52.         exit(-1);
  53.     }
  54.  
  55.     max1 = aptr + n*m;
  56.     while(aptr < max1) {
  57.         bptr = b++;
  58.         max2 = aptr + m;
  59.         while(aptr < max2) {
  60.             *bptr = *aptr++;
  61.             bptr += n;
  62.     }
  63.     }
  64.  
  65.     free(*a);
  66.     *a = bsave;
  67. }
  68.