Ticket #10568: 10568-speedup-QQmatrix-lmul.patch

File 10568-speedup-QQmatrix-lmul.patch, 2.8 KB (added by mderickx, 10 years ago)

Use this one, the others are old version

  • sage/matrix/matrix_sparse.pyx

    # HG changeset patch
    # User Maarten Derickx <m.derickx.student@gmail.com>
    # Date 1299088865 -3600
    # Node ID cd2581ba3fc7714ff0c8c5b0f53277cc8dac45b7
    # Parent  5551f9c44adcf5966536224c1b6c30878a8b903b
    #10568 speeds up scalar multiplication of sparse matrices a lot
    
    diff -r 5551f9c44adc -r cd2581ba3fc7 sage/matrix/matrix_sparse.pyx
    a b  
    44
    55cimport matrix
    66cimport matrix0
    7 from sage.structure.element cimport Element, Vector
     7from sage.structure.element cimport Element, RingElement, ModuleElement, Vector
    88from sage.rings.ring import is_Ring
     9from sage.misc.misc import verbose
    910
    1011include '../ext/cdefs.pxi'
    1112include '../ext/stdsage.pxi'
     
    287288       
    288289        return left.new_matrix(left._nrows, right._ncols, entries=e, coerce=False, copy=False)
    289290
     291    cpdef ModuleElement _lmul_(self, RingElement right):
     292        """
     293        Left scalar multiplication. Internal usage only.
     294       
     295        INPUT:
     296       
     297            - `right` -- a ring element which must already be in the basering of self (no coercion done here).
     298           
     299        OUTPUT:
     300       
     301            - the matrix self*right
     302       
     303        EXAMPLES::
     304       
     305            sage: M=Matrix(QQ,3,6,xrange(18),sparse=true); M
     306            [ 0  1  2  3  4  5]
     307            [ 6  7  8  9 10 11]
     308            [12 13 14 15 16 17]
     309            sage: (2/3)*M
     310            [   0  2/3  4/3    2  8/3 10/3]
     311            [   4 14/3 16/3    6 20/3 22/3]
     312            [   8 26/3 28/3   10 32/3 34/3]
     313            sage: 7*M
     314            [  0   7  14  21  28  35]
     315            [ 42  49  56  63  70  77]
     316            [ 84  91  98 105 112 119]           
     317            sage: (1/4)*M
     318            [   0  1/4  1/2  3/4    1  5/4]
     319            [ 3/2  7/4    2  9/4  5/2 11/4]
     320            [   3 13/4  7/2 15/4    4 17/4]
     321                 
     322        Really Large Example you wouldn't want to do with normal matrices::
     323           
     324            sage: M=MatrixSpace(QQ,100000,1000000,sparse=true)
     325            sage: m=M.random_element(density=1/100000000)
     326            sage: m==(97/42)*(42/97*m)
     327            True
     328           
     329        """
     330        cdef Py_ssize_t k, r, c
     331        cdef Matrix_sparse M
     332        nc, nr = self.ncols(), self.nrows()
     333        M = self.new_matrix(nr, nc, copy=False, coerce=False)
     334        nz = self.nonzero_positions(copy=False)
     335        for k from 0 <= k < len(nz):
     336            r = get_ij(nz, k, 0)
     337            c = get_ij(nz, k, 1)
     338            entry = self.get_unsafe(r,c)*right
     339            M.set_unsafe(r,c,entry)
     340        return M
     341
     342
    290343    cdef bint _will_use_strassen(self, matrix0.Matrix right) except -2:
    291344        # never use Strassen for sparse matrix multiply
    292345        return 0