Mercurial > octave
changeset 28059:e9d57f6d6353
allow sprand and sprandsym to create empty sparse matrices
* sprandsym.m, __sprand__.m: Allow dimensions to be 0.
* sprandsym.m, sprand.m, sprandn.m: Adjust tests.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 12 Feb 2020 12:21:26 -0500 |
parents | cf59b503db2a |
children | e8b5bca84d88 |
files | scripts/sparse/private/__sprand__.m scripts/sparse/sprand.m scripts/sparse/sprandn.m scripts/sparse/sprandsym.m |
diffstat | 4 files changed, 44 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/scripts/sparse/private/__sprand__.m Wed Feb 12 12:20:49 2020 -0500 +++ b/scripts/sparse/private/__sprand__.m Wed Feb 12 12:21:26 2020 -0500 @@ -49,16 +49,21 @@ [m, n, d, rc, fcnname, randfun] = deal (varargin{:}); endif - if (! (isscalar (m) && m == fix (m) && m > 0)) - error ("%s: M must be an integer greater than 0", fcnname); + if (! (isscalar (m) && m == fix (m) && m >= 0)) + error ("%s: M must be a non-negative integer", fcnname); endif - if (! (isscalar (n) && n == fix (n) && n > 0)) - error ("%s: N must be an integer greater than 0", fcnname); + if (! (isscalar (n) && n == fix (n) && n >= 0)) + error ("%s: N must be a non-negative integer", fcnname); endif if (d < 0 || d > 1) error ("%s: density D must be between 0 and 1", fcnname); endif + if (m == 0 || n == 0) + S = sparse (m, n); + return; + endif + if (nargin == 5) mn = m*n; k = round (d*mn);
--- a/scripts/sparse/sprand.m Wed Feb 12 12:20:49 2020 -0500 +++ b/scripts/sparse/sprand.m Wed Feb 12 12:21:26 2020 -0500 @@ -93,16 +93,22 @@ %!test %! s = sprand (1e6, 1e6, 1e-7); +## Test empty array creation +%!assert (size (sprand (0, 0, 0.5)), [0, 0]) +%!assert (size (sprand (0, 3, 0.5)), [0, 3]) +%!assert (size (sprand (3, 0, 0.5)), [3, 0]) + ## Test input validation %!error sprand () %!error sprand (1, 2) %!error sprand (1, 2, 3, 4) -%!error <M must be an integer greater than 0> sprand (ones (3), 3, 0.5) -%!error <M must be an integer greater than 0> sprand (3.5, 3, 0.5) -%!error <M must be an integer greater than 0> sprand (0, 3, 0.5) -%!error <N must be an integer greater than 0> sprand (3, ones (3), 0.5) -%!error <N must be an integer greater than 0> sprand (3, 3.5, 0.5) -%!error <N must be an integer greater than 0> sprand (3, 0, 0.5) +%!error <M must be a non-negative integer> sprand (-1, -1, 0.5) +%!error <M must be a non-negative integer> sprand (ones (3), 3, 0.5) +%!error <M must be a non-negative integer> sprand (3.5, 3, 0.5) +%!error <M must be a non-negative integer> sprand (-1, 3, 0.5) +%!error <N must be a non-negative integer> sprand (3, ones (3), 0.5) +%!error <N must be a non-negative integer> sprand (3, 3.5, 0.5) +%!error <N must be a non-negative integer> sprand (3, -1, 0.5) %!error <D must be between 0 and 1> sprand (3, 3, -1) %!error <D must be between 0 and 1> sprand (3, 3, 2) %!error <RC must be a scalar or vector> sprand (2, 2, 0.2, ones (3,3))
--- a/scripts/sparse/sprandn.m Wed Feb 12 12:20:49 2020 -0500 +++ b/scripts/sparse/sprandn.m Wed Feb 12 12:21:26 2020 -0500 @@ -92,16 +92,22 @@ %!test %! s = sprandn (1e6,1e6,1e-7); +## Test empty array creation +%!assert (size (sprandn (0, 0, 0.5)), [0, 0]) +%!assert (size (sprandn (0, 3, 0.5)), [0, 3]) +%!assert (size (sprandn (3, 0, 0.5)), [3, 0]) + ## Test input validation %!error sprandn () %!error sprandn (1, 2) %!error sprandn (1, 2, 3, 4) -%!error <M must be an integer greater than 0> sprandn (ones (3), 3, 0.5) -%!error <M must be an integer greater than 0> sprandn (3.5, 3, 0.5) -%!error <M must be an integer greater than 0> sprandn (0, 3, 0.5) -%!error <N must be an integer greater than 0> sprandn (3, ones (3), 0.5) -%!error <N must be an integer greater than 0> sprandn (3, 3.5, 0.5) -%!error <N must be an integer greater than 0> sprandn (3, 0, 0.5) +%!error <M must be a non-negative integer> sprand (-1, -1, 0.5) +%!error <M must be a non-negative integer> sprandn (ones (3), 3, 0.5) +%!error <M must be a non-negative integer> sprandn (3.5, 3, 0.5) +%!error <M must be a non-negative integer> sprandn (-1, 3, 0.5) +%!error <N must be a non-negative integer> sprandn (3, ones (3), 0.5) +%!error <N must be a non-negative integer> sprandn (3, 3.5, 0.5) +%!error <N must be a non-negative integer> sprandn (3, -1, 0.5) %!error <D must be between 0 and 1> sprandn (3, 3, -1) %!error <D must be between 0 and 1> sprandn (3, 3, 2) %!error <RC must be a scalar or vector> sprandn (2, 2, 0.2, ones (3,3))
--- a/scripts/sparse/sprandsym.m Wed Feb 12 12:20:49 2020 -0500 +++ b/scripts/sparse/sprandsym.m Wed Feb 12 12:21:26 2020 -0500 @@ -51,8 +51,13 @@ return; endif - if (!(isscalar (n) && n == fix (n) && n > 0)) - error ("sprandsym: N must be an integer greater than 0"); + if (!(isscalar (n) && n == fix (n) && n >= 0)) + error ("sprandsym: N must be a non-negative integer 0"); + endif + + if (n == 0) + S = sparse (n, n); + return; endif if (d < 0 || d > 1) @@ -172,11 +177,14 @@ %! assert (sort (i), [2 3]'); %! assert (sort (j), [2 3]'); +## Test empty array creation +%!assert (size (sprandsym (0, 0.5)), [0, 0]) + ## Test input validation %!error sprandsym () %!error sprandsym (1, 2, 3) %!error sprandsym (ones (3), 0.5) %!error sprandsym (3.5, 0.5) -%!error sprandsym (0, 0.5) +%!error sprandsym (-1, 0.5) %!error sprandsym (3, -1) %!error sprandsym (3, 2)