comparison test/test_diag_perm.m @ 8964:f4f4d65faaa0

Implement sparse * diagonal and diagonal * sparse operations, double-prec only. Date: Sun, 8 Mar 2009 16:28:18 -0400 These preserve sparsity, so eye(5) * sprand (5, 5, .2) is *sparse* and not dense. This may affect people who use multiplication by eye() rather than full(). The liboctave routines do *not* check if arguments are scalars in disguise. There is a type problem with checking at that level. I suspect we want diag * "sparse scalar" to stay diagonal, but we have to return a sparse matrix at the liboctave. Rather than worrying about that in liboctave, we cope with it when binding to Octave and return the correct higher-level type. The implementation is in Sparse-diag-op-defs.h rather than Sparse-op-defs.h to limit recompilation. And the implementations are templates rather than macros to produce better compiler errors and debugging information.
author Jason Riedy <jason@acm.org>
date Mon, 09 Mar 2009 17:49:13 -0400
parents 43aec7c168eb
children 42aff15e059b
comparison
equal deleted inserted replaced
8963:d1eab3ddb02d 8964:f4f4d65faaa0
132 %! d = rand (mn, 1); 132 %! d = rand (mn, 1);
133 %! D = diag (d, m, n); 133 %! D = diag (d, m, n);
134 %! Dslice = D (1:(m-3), 1:(n-2)); 134 %! Dslice = D (1:(m-3), 1:(n-2));
135 %! assert (typeinfo (Dslice), "diagonal matrix"); 135 %! assert (typeinfo (Dslice), "diagonal matrix");
136 136
137 ## preserve dense matrix structure 137 ## preserve dense matrix structure when scaling
138 %!assert (typeinfo (rand (8) * (3 * eye (8))), "matrix"); 138 %!assert (typeinfo (rand (8) * (3 * eye (8))), "matrix");
139 %!assert (typeinfo ((3 * eye (8)) * rand (8)), "matrix"); 139 %!assert (typeinfo ((3 * eye (8)) * rand (8)), "matrix");
140
141 ## preserve sparse matrix structure when scaling
142 %!assert (typeinfo (sprand (8, 8, .5) * (3 * eye (8))), "sparse matrix");
143 %!assert (typeinfo (sprand (8, 8, .5) * (3 * eye (8))'), "sparse matrix");
144 %!assert (typeinfo (((3 + 2 * I ()) * eye (8)) * sprand (8, 8, .5)), "sparse complex matrix");
145 %!assert (typeinfo (((3 + 2 * I ()) * eye (8))' * sprand (8, 8, .5)), "sparse complex matrix");
146 %!assert (typeinfo (sprand (8, 8, .5) * ((3 + 2 * I ()) * eye (8)).'), "sparse complex matrix");
140 147
141 ## scaling a matrix with exceptional values does not introduce new ones. 148 ## scaling a matrix with exceptional values does not introduce new ones.
142 %!test 149 %!test
143 %! n = 6; 150 %! n = 6;
144 %! dr = rand (n, 1); 151 %! dr = rand (n, 1);