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)