Ticket #10568: 10568-speedup-QQmatrix-lmul

File 10568-speedup-QQmatrix-lmul, 2.3 KB (added by mderickx, 10 years ago)
Line 
1#10568 speeds up scalar multiplication of sparse matrices a lot
2
3diff -r 2d2ae890de4a sage/matrix/matrix_sparse.pyx
4--- a/sage/matrix/matrix_sparse.pyx     Tue Jan 04 12:33:38 2011 +0100
5+++ b/sage/matrix/matrix_sparse.pyx     Tue Jan 11 13:02:15 2011 +0100
6@@ -4,8 +4,9 @@
7 
8 cimport matrix
9 cimport matrix0
10-from sage.structure.element cimport Element, Vector
11+from sage.structure.element cimport Element, RingElement, ModuleElement, Vector
12 from sage.rings.ring import is_Ring
13+from sage.misc.misc import verbose
14 
15 include '../ext/cdefs.pxi'
16 include '../ext/stdsage.pxi'
17@@ -287,6 +288,50 @@
18         
19         return left.new_matrix(left._nrows, right._ncols, entries=e, coerce=False, copy=False)
20 
21+    cpdef ModuleElement _lmul_(self, RingElement right):
22+        """
23+        Left scalar multiplication. Internal usage only.
24+       
25+        EXAMPLES::
26+       
27+            sage: M=Matrix(QQ,3,6,xrange(18),sparse=true); M
28+            [ 0  1  2  3  4  5]
29+            [ 6  7  8  9 10 11]
30+            [12 13 14 15 16 17]
31+            sage: (2/3)*M
32+            [   0  2/3  4/3    2  8/3 10/3]
33+            [   4 14/3 16/3    6 20/3 22/3]
34+            [   8 26/3 28/3   10 32/3 34/3]
35+            sage: 7*M
36+            [  0   7  14  21  28  35]
37+            [ 42  49  56  63  70  77]
38+            [ 84  91  98 105 112 119]           
39+            sage: (1/4)*M
40+            [   0  1/4  1/2  3/4    1  5/4]
41+            [ 3/2  7/4    2  9/4  5/2 11/4]
42+            [   3 13/4  7/2 15/4    4 17/4]
43+                 
44+        Really Large Example you wouldn't want to do with normal matrices::
45+           
46+            sage: M=MatrixSpace(QQ,100000,1000000,sparse=true)
47+            sage: m=M.random_element(density=1/100000000)
48+            sage: m==(97/42)*(42/97*m)
49+            True
50+           
51+        """
52+        cdef Py_ssize_t k, r, c
53+        cdef Matrix_sparse M
54+        nc, nr = self.ncols(), self.nrows()
55+        M = self.new_matrix(nr, nc, copy=False, coerce=False)
56+        nz = self.nonzero_positions(copy=False)
57+        for k from 0 <= k < len(nz):
58+            r = get_ij(nz, k, 0)
59+            c = get_ij(nz, k, 1)
60+            entry = self.get_unsafe(r,c)*right
61+            M.set_unsafe(r,c,entry)
62+        return M
63+
64+
65     cdef bint _will_use_strassen(self, matrix0.Matrix right) except -2:
66         # never use Strassen for sparse matrix multiply
67         return 0