octave-maintainers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Sparse Transpose


From: David Bateman
Subject: Sparse Transpose
Date: Tue, 07 Mar 2006 23:57:47 +0100
User-agent: Mozilla Thunderbird 1.0.6-7.5.20060mdk (X11/20050322)

Find attached a small patch that vastly accelerates the sparse transpose
function. Running

n=1e4;for
i=-5:-2,a=sprandn(n,n,10^i);t=cputime();b=a';t0=cputime()-t;printf("%6g
%6g %f\n", n, 10^i, t0); fflush(stdout); endfor

I get

   n          d        time
 10000  1e-05 1.092834
 10000 0.0001 2.678592
 10000  0.001 10.210447
  (Ctrl-c since my patience ran out)

before and after the patch I get

 10000  1e-05 0.000999
 10000 0.0001 0.001000
 10000  0.001 0.006000
 10000   0.01 0.091985

for a factor of between 100 to 1000 speed-up.

Regards
David

2006-03-07  David Bateman  <address@hidden>

    * Sparse.cc (Sparse<T>::transpose (void) const): Accelerate algorithm.
    * CSparse.cc (SparseComplexMatrix::transpose (void) const): ditto.


-- 
David Bateman                                address@hidden
Motorola Labs - Paris                        +33 1 69 35 48 04 (Ph) 
Parc Les Algorithmes, Commune de St Aubin    +33 6 72 01 06 33 (Mob) 
91193 Gif-Sur-Yvette FRANCE                  +33 1 69 35 77 01 (Fax) 

The information contained in this communication has been classified as: 

[x] General Business Information 
[ ] Motorola Internal Use Only 
[ ] Motorola Confidential Proprietary

Index: liboctave/Sparse.cc
===================================================================
RCS file: /usr/local/cvsroot/octave/liboctave/Sparse.cc,v
retrieving revision 1.8
diff -c -r1.8 Sparse.cc
*** liboctave/Sparse.cc 20 Feb 2006 22:05:31 -0000      1.8
--- liboctave/Sparse.cc 7 Mar 2006 22:54:23 -0000
***************
*** 1034,1054 ****
  
    octave_idx_type nr = rows ();
    octave_idx_type nc = cols ();
!   octave_idx_type nz = nzmax ();
    Sparse<T> retval (nc, nr, nz);
  
!   retval.cidx(0) = 0;
!   for (octave_idx_type i = 0, iidx = 0; i < nr; i++)
!     {
!       for (octave_idx_type j = 0; j < nc; j++)
!       for (octave_idx_type k = cidx(j); k < cidx(j+1); k++)
!         if (ridx(k) == i)
!           {
!             retval.data(iidx) = data(k);
!             retval.ridx(iidx++) = j;
!           }
!       retval.cidx(i+1) = iidx;
!     }
  
    return retval;
  }
--- 1034,1064 ----
  
    octave_idx_type nr = rows ();
    octave_idx_type nc = cols ();
!   octave_idx_type nz = nnz ();
    Sparse<T> retval (nc, nr, nz);
  
!   OCTAVE_LOCAL_BUFFER (octave_idx_type, w, nr + 1);
!   for (octave_idx_type i = 0; i < nr; i++)
!     w[i] = 0;
!   for (octave_idx_type i = 0; i < nz; i++)
!     w[ridx(i)]++;
!   nz = 0;
!   for (octave_idx_type i = 0; i < nr; i++)
!     {
!       retval.xcidx(i) = nz;
!       nz += w[i];
!       w[i] = retval.xcidx(i);
!     }
!   retval.xcidx(nr) = nz;
!   w[nr] = nz;
! 
!   for (octave_idx_type j = 0; j < nc; j++)
!     for (octave_idx_type k = cidx(j); k < cidx(j+1); k++)
!       {
!       octave_idx_type q = w [ridx(k)]++;
!       retval.xridx (q) = j;
!       retval.xdata (q) = data (k);
!       }
  
    return retval;
  }
Index: liboctave/CSparse.cc
===================================================================
RCS file: /usr/local/cvsroot/octave/liboctave/CSparse.cc,v
retrieving revision 1.18
diff -c -r1.18 CSparse.cc
*** liboctave/CSparse.cc        20 Feb 2006 22:05:30 -0000      1.18
--- liboctave/CSparse.cc        7 Mar 2006 22:55:20 -0000
***************
*** 549,566 ****
    octave_idx_type nz = nzmax ();
    SparseComplexMatrix retval (nc, nr, nz);
  
!   retval.cidx(0) = 0;
!   for (octave_idx_type i = 0, iidx = 0; i < nr; i++)
!     {
!       for (octave_idx_type j = 0; j < nc; j++)
!       for (octave_idx_type k = cidx(j); k < cidx(j+1); k++)
!         if (ridx(k) == i)
!           {
!             retval.data(iidx) = conj (data(k));
!             retval.ridx(iidx++) = j;
!           }
!       retval.cidx(i+1) = iidx;
!     }
  
    return retval;
  }
--- 549,576 ----
    octave_idx_type nz = nzmax ();
    SparseComplexMatrix retval (nc, nr, nz);
  
!   OCTAVE_LOCAL_BUFFER (octave_idx_type, w, nr + 1);
!   for (octave_idx_type i = 0; i < nr; i++)
!     w[i] = 0;
!   for (octave_idx_type i = 0; i < nz; i++)
!     w[ridx(i)]++;
!   nz = 0;
!   for (octave_idx_type i = 0; i < nr; i++)
!     {
!       retval.xcidx(i) = nz;
!       nz += w[i];
!       w[i] = retval.xcidx(i);
!     }
!   retval.xcidx(nr) = nz;
!   w[nr] = nz;
! 
!   for (octave_idx_type j = 0; j < nc; j++)
!     for (octave_idx_type k = cidx(j); k < cidx(j+1); k++)
!       {
!       octave_idx_type q = w [ridx(k)]++;
!       retval.xridx (q) = j;
!       retval.xdata (q) = conj (data (k));
!       }
  
    return retval;
  }

reply via email to

[Prev in Thread] Current Thread [Next in Thread]