changeset 31627:1e270beb6982

maint: Merge stable to default.
author John W. Eaton <jwe@octave.org>
date Sat, 03 Dec 2022 01:01:57 -0500
parents 9034cf663768 (current diff) 59422a6fbd91 (diff)
children 2fbbf9c07327
files libinterp/corefcn/data.cc
diffstat 2 files changed, 24 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/data.cc	Sat Dec 03 01:00:04 2022 -0500
+++ b/libinterp/corefcn/data.cc	Sat Dec 03 01:01:57 2022 -0500
@@ -4579,7 +4579,7 @@
 @deftypefnx {} {@var{val} =} ones (@var{m}, @var{n})
 @deftypefnx {} {@var{val} =} ones (@var{m}, @var{n}, @var{k}, @dots{})
 @deftypefnx {} {@var{val} =} ones ([@var{m} @var{n} @dots{}])
-@deftypefnx {} {@var{val} =} ones (@dots{}, "@var{like}", @var{var})
+@deftypefnx {} {@var{val} =} ones (@dots{}, "like", @var{var})
 @deftypefnx {} {@var{val} =} ones (@dots{}, @var{class})
 Return a matrix or N-dimensional array whose elements are all 1.
 
@@ -4672,7 +4672,7 @@
 @deftypefnx {} {@var{val} =} zeros (@var{m}, @var{n})
 @deftypefnx {} {@var{val} =} zeros (@var{m}, @var{n}, @var{k}, @dots{})
 @deftypefnx {} {@var{val} =} zeros ([@var{m} @var{n} @dots{}])
-@deftypefnx {} {@var{val} =} zeros (@dots{}, "@var{like}", @var{var})
+@deftypefnx {} {@var{val} =} zeros (@dots{}, "like", @var{var})
 @deftypefnx {} {@var{val} =} zeros (@dots{}, @var{class})
 Return a matrix or N-dimensional array whose elements are all 0.
 
@@ -4820,7 +4820,7 @@
 @deftypefnx {} {@var{val} =} NaN (@var{n})
 @deftypefnx {} {@var{val} =} NaN (@var{n}, @var{m})
 @deftypefnx {} {@var{val} =} NaN (@var{n}, @var{m}, @var{k}, @dots{})
-@deftypefnx {} {@var{val} =} NaN (@dots{}, "@var{like}", @var{var})
+@deftypefnx {} {@var{val} =} NaN (@dots{}, "like", @var{var})
 @deftypefnx {} {@var{val} =} NaN (@dots{}, @var{class})
 Return a scalar, matrix, or N-dimensional array whose elements are all equal
 to the IEEE symbol NaN (Not a Number).
@@ -5226,7 +5226,7 @@
 @deftypefnx {} {@var{val} =} NA (@var{n})
 @deftypefnx {} {@var{val} =} NA (@var{n}, @var{m})
 @deftypefnx {} {@var{val} =} NA (@var{n}, @var{m}, @var{k}, @dots{})
-@deftypefnx {} {@var{val} =} NA (@dots{}, "@var{like}", @var{var})
+@deftypefnx {} {@var{val} =} NA (@dots{}, "like", @var{var})
 @deftypefnx {} {@var{val} =} NA (@dots{}, @var{class})
 Return a scalar, matrix, or N-dimensional array whose elements are all equal
 to the special constant used to designate missing values.
@@ -5265,7 +5265,7 @@
 @deftypefn  {} {@var{val} =} false (@var{x})
 @deftypefnx {} {@var{val} =} false (@var{n}, @var{m})
 @deftypefnx {} {@var{val} =} false (@var{n}, @var{m}, @var{k}, @dots{})
-@deftypefnx {} {@var{val} =} false (@dots{}, "@var{like}", @var{var})
+@deftypefnx {} {@var{val} =} false (@dots{}, "like", @var{var})
 Return a matrix or N-dimensional array whose elements are all logical 0.
 
 If invoked with a single scalar integer argument, return a square
@@ -5300,7 +5300,7 @@
 @deftypefn  {} {@var{val} =} true (@var{x})
 @deftypefnx {} {@var{val} =} true (@var{n}, @var{m})
 @deftypefnx {} {@var{val} =} true (@var{n}, @var{m}, @var{k}, @dots{})
-@deftypefnx {} {@var{val} =} true (@dots{}, "@var{like}", @var{var})
+@deftypefnx {} {@var{val} =} true (@dots{}, "like", @var{var})
 Return a matrix or N-dimensional array whose elements are all logical 1.
 
 If invoked with a single scalar integer argument, return a square
--- a/scripts/statistics/mean.m	Sat Dec 03 01:00:04 2022 -0500
+++ b/scripts/statistics/mean.m	Sat Dec 03 01:01:57 2022 -0500
@@ -177,10 +177,8 @@
       ndims = numel (sz);
       misdim = [1:ndims];
 
-      ## keep remaining dimensions
-      for i = 1:numel (dim)
-        misdim(misdim == dim(i)) = [];
-      endfor
+      dim(dim > ndims) = [];  # weed out dimensions larger than array
+      misdim(dim) = [];       # remove dims asked for leaving missing dims
 
       switch (numel (misdim))
         ## if all dimensions are given, compute x(:)
@@ -196,26 +194,30 @@
         ## for 1 dimension left, return column vector
         case 1
           x = permute (x, [misdim, dim]);
+          y = zeros (size (x, 1), 1, "like", x);
           for i = 1:size (x, 1)
-            x_vec = x(i,:,:,:,:,:,:)(:);
+            x_vec = x(i,:)(:);
             if (omitnan)
               x_vec = x_vec(! isnan (x_vec));
             endif
             y(i) = sum (x_vec, 1) ./ numel (x_vec);
           endfor
+          y = ipermute (y, [misdim, dim]);
 
         ## for 2 dimensions left, return matrix
         case 2
           x = permute (x, [misdim, dim]);
+          y = zeros (size (x, 1), size (x, 2), "like", x);
           for i = 1:size (x, 1)
             for j = 1:size (x, 2)
-              x_vec = x(i,j,:,:,:,:,:)(:);
+              x_vec = x(i,j,:)(:);
               if (omitnan)
                 x_vec = x_vec(! isnan (x_vec));
               endif
               y(i,j) = sum (x_vec, 1) ./ numel (x_vec);
             endfor
           endfor
+          y = ipermute (y, [misdim, dim]);
 
         ## for more than 2 dimensions left, throw error
         otherwise
@@ -319,16 +321,16 @@
 ## Test dimension indexing with vecdim in N-dimensional arrays
 %!test
 %! x = repmat ([1:20;6:25], [5 2 6 3]);
-%! assert (size (mean (x, [3 2])), [10 3]);
-%! assert (size (mean (x, [1 2])), [6 3]);
-%! assert (size (mean (x, [1 2 4])), [1 6]);
+%! assert (size (mean (x, [3 2])), [10 1 1 3]);
+%! assert (size (mean (x, [1 2])), [1 1 6 3]);
+%! assert (size (mean (x, [1 2 4])), [1 1 6]);
 %! assert (size (mean (x, [1 4 3])), [1 40]);
 %! assert (size (mean (x, [1 2 3 4])), [1 1]);
 
 ## Test results with vecdim in N-dimensional arrays and "omitnan"
 %!test
 %! x = repmat ([1:20;6:25], [5 2 6 3]);
-%! m = repmat ([10.5;15.5], [5,3]);
+%! m = repmat ([10.5;15.5], [5 1 1 3]);
 %! assert (mean (x, [3 2]), m, 4e-14);
 %! x(2,5,6,3) = NaN;
 %! m(2,3) = NaN;
@@ -337,12 +339,12 @@
 %! assert (mean (x, [3 2], "omitnan"), m, 4e-14);
 
 ## Test input validation
-%!error <Invalid call to mean.  Correct usage is> mean ()
-%!error <Invalid call to mean.  Correct usage is> mean (1, 2, 3)
-%!error <Invalid call to mean.  Correct usage is> mean (1, 2, 3, 4, 5)
-%!error <Invalid call to mean.  Correct usage is> mean (1, "all", 3)
-%!error <Invalid call to mean.  Correct usage is> mean (1, "b")
-%!error <Invalid call to mean.  Correct usage is> mean (1, 1, "foo")
+%!error <Invalid call> mean ()
+%!error <Invalid call> mean (1, 2, 3)
+%!error <Invalid call> mean (1, 2, 3, 4, 5)
+%!error <Invalid call> mean (1, "all", 3)
+%!error <Invalid call> mean (1, "b")
+%!error <Invalid call> mean (1, 1, "foo")
 %!error <X must be either a numeric or logical> mean ({1:5})
 %!error <X must be either a numeric or logical> mean ("char")
 %!error <DIM must be a positive integer> mean (1, ones (2,2))