annotate scripts/statistics/mean.m @ 31623:59422a6fbd91 stable

mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411) * mean.m: Accept large DIM inputs by removing any dimensions larger than the dimensions of the input array. Use vectorized operations, rather than for loop, for this input validation. Pre-declare output array before for loop for performance. Use ipermute() after calculations to return correctly-dimensioned result (checked with Matlab). Change BIST tests results to match correct behavior.
author Rik <rik@octave.org>
date Fri, 02 Dec 2022 21:34:15 -0800
parents c154cc05cd1f
children 597f3ee61a48
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
1 ########################################################################
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
2 ##
30564
796f54d4ddbf update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 29359
diff changeset
3 ## Copyright (C) 1995-2022 The Octave Project Developers
27918
b442ec6dda5c use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents: 26596
diff changeset
4 ##
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
5 ## See the file COPYRIGHT.md in the top-level directory of this
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
6 ## distribution or <https://octave.org/copyright/>.
3426
f8dde1807dee [project @ 2000-01-13 08:40:00 by jwe]
jwe
parents: 3367
diff changeset
7 ##
3922
38c61cbf086c [project @ 2002-05-01 06:48:35 by jwe]
jwe
parents: 3456
diff changeset
8 ## This file is part of Octave.
38c61cbf086c [project @ 2002-05-01 06:48:35 by jwe]
jwe
parents: 3456
diff changeset
9 ##
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 24512
diff changeset
10 ## Octave is free software: you can redistribute it and/or modify it
3922
38c61cbf086c [project @ 2002-05-01 06:48:35 by jwe]
jwe
parents: 3456
diff changeset
11 ## under the terms of the GNU General Public License as published by
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 24512
diff changeset
12 ## the Free Software Foundation, either version 3 of the License, or
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22323
diff changeset
13 ## (at your option) any later version.
3426
f8dde1807dee [project @ 2000-01-13 08:40:00 by jwe]
jwe
parents: 3367
diff changeset
14 ##
3922
38c61cbf086c [project @ 2002-05-01 06:48:35 by jwe]
jwe
parents: 3456
diff changeset
15 ## Octave is distributed in the hope that it will be useful, but
3200
781c930425fd [project @ 1998-10-29 05:23:08 by jwe]
jwe
parents:
diff changeset
16 ## WITHOUT ANY WARRANTY; without even the implied warranty of
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22323
diff changeset
17 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22323
diff changeset
18 ## GNU General Public License for more details.
3426
f8dde1807dee [project @ 2000-01-13 08:40:00 by jwe]
jwe
parents: 3367
diff changeset
19 ##
3200
781c930425fd [project @ 1998-10-29 05:23:08 by jwe]
jwe
parents:
diff changeset
20 ## You should have received a copy of the GNU General Public License
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 7001
diff changeset
21 ## along with Octave; see the file COPYING. If not, see
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 24512
diff changeset
22 ## <https://www.gnu.org/licenses/>.
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
23 ##
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
24 ########################################################################
3200
781c930425fd [project @ 1998-10-29 05:23:08 by jwe]
jwe
parents:
diff changeset
25
3367
0748b03c3510 [project @ 1999-11-20 14:52:38 by jwe]
jwe
parents: 3265
diff changeset
26 ## -*- texinfo -*-
30875
5d3faba0342e doc: Ensure documentation lists output argument when it exists for all m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
27 ## @deftypefn {} {@var{y} =} mean (@var{x})
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
28 ## @deftypefnx {} {@var{y} =} mean (@var{x}, 'all')
30875
5d3faba0342e doc: Ensure documentation lists output argument when it exists for all m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
29 ## @deftypefnx {} {@var{y} =} mean (@var{x}, @var{dim})
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
30 ## @deftypefnx {} {@var{y} =} mean (@dots{}, '@var{outtype}')
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
31 ## @deftypefnx {} {@var{y} =} mean (@dots{}, '@var{nanflag}')
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
32 ## Compute the mean of the elements of @var{x}.
20174
d9341b422488 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19833
diff changeset
33 ##
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
34 ## @itemize
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
35 ## @item
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
36 ## If @var{x} is a vector, then @code{mean (@var{x})} returns the
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
37 ## mean of the elements in @var{x} defined as
3367
0748b03c3510 [project @ 1999-11-20 14:52:38 by jwe]
jwe
parents: 3265
diff changeset
38 ## @tex
0748b03c3510 [project @ 1999-11-20 14:52:38 by jwe]
jwe
parents: 3265
diff changeset
39 ## $$ {\rm mean}(x) = \bar{x} = {1\over N} \sum_{i=1}^N x_i $$
24511
4f0e6ee6c9b8 Make documentation Sec 26.1 more consistent and Sec 25.4 clearer (bug #52685)
Daniel J Sebald <daniel.sebald@ieee.org>
parents: 23219
diff changeset
40 ## where $N$ is the number of elements of @var{x}.
4f0e6ee6c9b8 Make documentation Sec 26.1 more consistent and Sec 25.4 clearer (bug #52685)
Daniel J Sebald <daniel.sebald@ieee.org>
parents: 23219
diff changeset
41 ##
3367
0748b03c3510 [project @ 1999-11-20 14:52:38 by jwe]
jwe
parents: 3265
diff changeset
42 ## @end tex
8517
81d6ab3ac93c Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents: 7411
diff changeset
43 ## @ifnottex
3426
f8dde1807dee [project @ 2000-01-13 08:40:00 by jwe]
jwe
parents: 3367
diff changeset
44 ##
3367
0748b03c3510 [project @ 1999-11-20 14:52:38 by jwe]
jwe
parents: 3265
diff changeset
45 ## @example
24511
4f0e6ee6c9b8 Make documentation Sec 26.1 more consistent and Sec 25.4 clearer (bug #52685)
Daniel J Sebald <daniel.sebald@ieee.org>
parents: 23219
diff changeset
46 ## mean (@var{x}) = SUM_i @var{x}(i) / N
3367
0748b03c3510 [project @ 1999-11-20 14:52:38 by jwe]
jwe
parents: 3265
diff changeset
47 ## @end example
10821
693e22af08ae Grammarcheck documentation of m-files
Rik <octave@nomad.inbox5.com>
parents: 10687
diff changeset
48 ##
24985
d85b2485af9e doc: grammarcheck m-files ahead of 4.4 release.
Rik <rik@octave.org>
parents: 24869
diff changeset
49 ## @noindent
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
50 ## where @math{N} is the number of elements in the @var{x} vector.
24511
4f0e6ee6c9b8 Make documentation Sec 26.1 more consistent and Sec 25.4 clearer (bug #52685)
Daniel J Sebald <daniel.sebald@ieee.org>
parents: 23219
diff changeset
51 ##
8517
81d6ab3ac93c Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents: 7411
diff changeset
52 ## @end ifnottex
3200
781c930425fd [project @ 1998-10-29 05:23:08 by jwe]
jwe
parents:
diff changeset
53 ##
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
54 ## @item
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
55 ## If @var{x} is a matrix, then @code{mean} returns a row vector with the mean
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
56 ## of each column in @var{x}.
3367
0748b03c3510 [project @ 1999-11-20 14:52:38 by jwe]
jwe
parents: 3265
diff changeset
57 ##
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
58 ## @item
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
59 ## If @var{x} is a multi-dimensional array, then @code{mean} operates along the
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
60 ## first non-singleton dimension of @var{x}.
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
61 ## @end itemize
3367
0748b03c3510 [project @ 1999-11-20 14:52:38 by jwe]
jwe
parents: 3265
diff changeset
62 ##
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
63 ## The optional input @var{dim} forces @code{mean} to operate over the
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
64 ## specified dimension(s). @var{dim} can either be a scalar dimension or a
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
65 ## vector of non-repeating dimensions. Dimensions must be positive integers,
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
66 ## and the mean is calculated over the array slice defined by @var{dim}.
3367
0748b03c3510 [project @ 1999-11-20 14:52:38 by jwe]
jwe
parents: 3265
diff changeset
67 ##
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
68 ## Specifying dimension @qcode{"all"} will force @code{mean} to operate on all
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
69 ## elements of @var{x}, and is equivalent to @code{mean (@var{x}(:))}.
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
70 ##
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
71 ## The optional input @var{outtype} specifies the data type that is returned.
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
72 ## Valid values are:
4022
789c4112a37d [project @ 2002-08-06 03:42:41 by jwe]
jwe
parents: 3922
diff changeset
73 ##
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
74 ## @table @asis
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
75 ## @item @qcode{'default'} : Output is of type double, unless the input is
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
76 ## single in which case the output is of type single.
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
77 ##
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
78 ## @item @qcode{'double'} : Output is of type double.
24869
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
79 ##
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
80 ## @item @qcode{'native'} : Output is of the same type as the input
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
81 ## (@code{class (@var{x})}), unless the input is logical in which case the
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
82 ## output is of type double.
24869
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
83 ##
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
84 ## @end table
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
85 ##
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
86 ## The optional input @var{nanflag} specifies whether to include/exclude NaN
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
87 ## values from the calculation. By default, NaN values are included in the
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
88 ## calculation (@var{nanflag} has the value @qcode{'includenan'}). To exclude
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
89 ## NaN values, set the value of @var{nanflag} to @qcode{'omitnan'}.
24869
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
90 ##
12575
d0b799dafede Grammarcheck files for 3.4.1 release.
Rik <octave@nomad.inbox5.com>
parents: 12454
diff changeset
91 ## @seealso{median, mode}
3367
0748b03c3510 [project @ 1999-11-20 14:52:38 by jwe]
jwe
parents: 3265
diff changeset
92 ## @end deftypefn
3426
f8dde1807dee [project @ 2000-01-13 08:40:00 by jwe]
jwe
parents: 3367
diff changeset
93
24869
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
94 function y = mean (x, varargin)
4022
789c4112a37d [project @ 2002-08-06 03:42:41 by jwe]
jwe
parents: 3922
diff changeset
95
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
96 if (nargin < 1 || nargin > 4 || ! all (cellfun (@ischar, varargin(2:end))))
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
97 print_usage ();
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
98 endif
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
99
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
100 ## Check all char arguments.
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
101 all_flag = false;
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
102 omitnan = false;
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
103 outtype = "default";
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
104
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
105 for i = 1:numel (varargin)
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
106 if (ischar (varargin{i}))
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
107 switch (varargin{i})
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
108 case "all"
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
109 all_flag = true;
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
110 case "includenan"
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
111 omitnan = false;
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
112 case "omitnan"
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
113 omitnan = true;
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
114 case {"default", "double", "native"}
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
115 outtype = varargin{i};
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
116 otherwise
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
117 print_usage ();
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
118 endswitch
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
119 endif
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
120 endfor
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
121 varargin(cellfun (@ischar, varargin)) = [];
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
122
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
123 if (((numel (varargin) == 1) && ! (isnumeric (varargin{1}))) ...
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
124 || (numel (varargin) > 1))
11436
e151e23f73bc Overhaul base statistics functions and documentation of same.
Rik <octave@nomad.inbox5.com>
parents: 10821
diff changeset
125 print_usage ();
e151e23f73bc Overhaul base statistics functions and documentation of same.
Rik <octave@nomad.inbox5.com>
parents: 10821
diff changeset
126 endif
e151e23f73bc Overhaul base statistics functions and documentation of same.
Rik <octave@nomad.inbox5.com>
parents: 10821
diff changeset
127
12435
0f21f258aa17 mean: also accept logical values
John W. Eaton <jwe@octave.org>
parents: 11595
diff changeset
128 if (! (isnumeric (x) || islogical (x)))
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
129 error ("mean: X must be either a numeric or logical vector or matrix");
3200
781c930425fd [project @ 1998-10-29 05:23:08 by jwe]
jwe
parents:
diff changeset
130 endif
3426
f8dde1807dee [project @ 2000-01-13 08:40:00 by jwe]
jwe
parents: 3367
diff changeset
131
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
132 if (numel (varargin) == 0)
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
133
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
134 ## Single numeric input argument, no dimensions given.
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
135 if (all_flag)
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
136 n = numel (x(:));
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
137 if (omitnan)
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
138 idx = isnan (x);
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
139 n -= sum (idx(:));
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
140 x(idx) = 0;
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
141 endif
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
142 y = sum (x(:), 1) ./ n;
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
143 else
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
144 sz = size (x);
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
145 ## Find the first non-singleton dimension.
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
146 (dim = find (sz != 1, 1)) || (dim = 1);
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
147 n = size (x, dim);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
148 if (omitnan)
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
149 idx = isnan (x);
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
150 n = sum (! idx, dim);
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
151 x(idx) = 0;
24869
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
152 endif
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
153 y = sum (x, dim) ./ n;
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
154 endif
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
155
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
156 else
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
157
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
158 ## Two numeric input arguments, dimensions given. Note scalar is vector!
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
159 dim = varargin{1};
31533
c154cc05cd1f mean.m: Improve clarity and performance of input validation (bug #63410)
Rik <rik@octave.org>
parents: 31525
diff changeset
160 if (! (isvector (dim) && all (dim > 0) && all (rem (dim, 1) == 0)))
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
161 error ("mean: DIM must be a positive integer scalar or vector");
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
162 endif
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
163
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
164 if (isscalar (dim))
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
165
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
166 n = size (x, dim);
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
167 if (omitnan)
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
168 idx = isnan (x);
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
169 n = sum (! idx, dim);
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
170 x(idx) = 0;
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
171 endif
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
172 y = sum (x, dim) ./ n;
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
173
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
174 else
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
175
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
176 sz = size (x);
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
177 ndims = numel (sz);
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
178 misdim = [1:ndims];
3200
781c930425fd [project @ 1998-10-29 05:23:08 by jwe]
jwe
parents:
diff changeset
179
31623
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
180 dim(dim > ndims) = []; # weed out dimensions larger than array
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
181 misdim(dim) = []; # remove dims asked for leaving missing dims
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
182
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
183 switch (numel (misdim))
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
184 ## if all dimensions are given, compute x(:)
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
185 case 0
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
186 n = numel (x(:));
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
187 if (omitnan)
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
188 idx = isnan (x);
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
189 n -= sum (idx(:));
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
190 x(idx) = 0;
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
191 endif
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
192 y = sum (x(:), 1) ./ n;
3426
f8dde1807dee [project @ 2000-01-13 08:40:00 by jwe]
jwe
parents: 3367
diff changeset
193
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
194 ## for 1 dimension left, return column vector
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
195 case 1
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
196 x = permute (x, [misdim, dim]);
31623
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
197 y = zeros (size (x, 1), 1, "like", x);
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
198 for i = 1:size (x, 1)
31623
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
199 x_vec = x(i,:)(:);
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
200 if (omitnan)
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
201 x_vec = x_vec(! isnan (x_vec));
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
202 endif
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
203 y(i) = sum (x_vec, 1) ./ numel (x_vec);
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
204 endfor
31623
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
205 y = ipermute (y, [misdim, dim]);
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
206
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
207 ## for 2 dimensions left, return matrix
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
208 case 2
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
209 x = permute (x, [misdim, dim]);
31623
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
210 y = zeros (size (x, 1), size (x, 2), "like", x);
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
211 for i = 1:size (x, 1)
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
212 for j = 1:size (x, 2)
31623
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
213 x_vec = x(i,j,:)(:);
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
214 if (omitnan)
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
215 x_vec = x_vec(! isnan (x_vec));
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
216 endif
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
217 y(i,j) = sum (x_vec, 1) ./ numel (x_vec);
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
218 endfor
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
219 endfor
31623
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
220 y = ipermute (y, [misdim, dim]);
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
221
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
222 ## for more than 2 dimensions left, throw error
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
223 otherwise
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
224 error ("DIM must index at least N-2 dimensions of X");
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
225 endswitch
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
226 endif
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
227
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
228 endif
3426
f8dde1807dee [project @ 2000-01-13 08:40:00 by jwe]
jwe
parents: 3367
diff changeset
229
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
230 ## Convert output if requested
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
231 switch (outtype)
24869
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
232 case "default"
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
233 ## do nothing, the operators already do the right thing.
24869
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
234 case "double"
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
235 y = double (y);
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
236 case "native"
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
237 if (! islogical (x))
24869
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
238 y = cast (y, class (x));
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
239 endif
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
240 otherwise
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
241 ## FIXME: This is unreachable code. Valid values already
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
242 ## checked in input validation.
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
243 error ("mean: OUTTYPE '%s' not recognized", outtype);
24869
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
244 endswitch
28945
6e460773bdda maint: Use newlines after "function" and before "endfunction" for clarity.
Rik <rik@octave.org>
parents: 28929
diff changeset
245
3200
781c930425fd [project @ 1998-10-29 05:23:08 by jwe]
jwe
parents:
diff changeset
246 endfunction
7411
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7017
diff changeset
247
12656
6b2f14af2360 Overhaul functions in statistics/base directory.
Rik <octave@nomad.inbox5.com>
parents: 12575
diff changeset
248
7411
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7017
diff changeset
249 %!test
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7017
diff changeset
250 %! x = -10:10;
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7017
diff changeset
251 %! y = x';
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7017
diff changeset
252 %! z = [y, y+10];
14363
f3d52523cde1 Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
253 %! assert (mean (x), 0);
f3d52523cde1 Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
254 %! assert (mean (y), 0);
f3d52523cde1 Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
255 %! assert (mean (z), [0, 10]);
7411
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7017
diff changeset
256
14363
f3d52523cde1 Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
257 %!assert (mean (magic (3), 1), [5, 5, 5])
f3d52523cde1 Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
258 %!assert (mean (magic (3), 2), [5; 5; 5])
f3d52523cde1 Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
259 %!assert (mean (logical ([1 0 1 1])), 0.75)
f3d52523cde1 Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
260 %!assert (mean (single ([1 0 1 1])), single (0.75))
21309
7fbecef105ca Allow statistics functions to work over non-existent dimension (bug #33523).
Rik <rik@octave.org>
parents: 20852
diff changeset
261 %!assert (mean ([1 2], 3), [1 2])
11436
e151e23f73bc Overhaul base statistics functions and documentation of same.
Rik <octave@nomad.inbox5.com>
parents: 10821
diff changeset
262
24869
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
263 ## Test outtype option
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
264 %!test
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
265 %! in = [1 2 3];
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
266 %! out = 2;
28929
9e43deb9bfc3 maint: Use semicolon after assert statement inside %!test blocks.
Rik <rik@octave.org>
parents: 27984
diff changeset
267 %! assert (mean (in, "default"), mean (in));
9e43deb9bfc3 maint: Use semicolon after assert statement inside %!test blocks.
Rik <rik@octave.org>
parents: 27984
diff changeset
268 %! assert (mean (in, "default"), out);
24869
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
269 %!
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
270 %! in = single ([1 2 3]);
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
271 %! out = 2;
28929
9e43deb9bfc3 maint: Use semicolon after assert statement inside %!test blocks.
Rik <rik@octave.org>
parents: 27984
diff changeset
272 %! assert (mean (in, "default"), mean (in));
9e43deb9bfc3 maint: Use semicolon after assert statement inside %!test blocks.
Rik <rik@octave.org>
parents: 27984
diff changeset
273 %! assert (mean (in, "default"), single (out));
9e43deb9bfc3 maint: Use semicolon after assert statement inside %!test blocks.
Rik <rik@octave.org>
parents: 27984
diff changeset
274 %! assert (mean (in, "double"), out);
9e43deb9bfc3 maint: Use semicolon after assert statement inside %!test blocks.
Rik <rik@octave.org>
parents: 27984
diff changeset
275 %! assert (mean (in, "native"), single (out));
24869
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
276 %!
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
277 %! in = uint8 ([1 2 3]);
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
278 %! out = 2;
28929
9e43deb9bfc3 maint: Use semicolon after assert statement inside %!test blocks.
Rik <rik@octave.org>
parents: 27984
diff changeset
279 %! assert (mean (in, "default"), mean (in));
9e43deb9bfc3 maint: Use semicolon after assert statement inside %!test blocks.
Rik <rik@octave.org>
parents: 27984
diff changeset
280 %! assert (mean (in, "default"), out);
9e43deb9bfc3 maint: Use semicolon after assert statement inside %!test blocks.
Rik <rik@octave.org>
parents: 27984
diff changeset
281 %! assert (mean (in, "double"), out);
9e43deb9bfc3 maint: Use semicolon after assert statement inside %!test blocks.
Rik <rik@octave.org>
parents: 27984
diff changeset
282 %! assert (mean (in, "native"), uint8 (out));
24869
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
283 %!
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
284 %! in = logical ([1 0 1]);
170e8625562a mean.m: add out_type option to control data type of return value
Carnë Draug <carandraug@octave.org>
parents: 24547
diff changeset
285 %! out = 2/3;
28929
9e43deb9bfc3 maint: Use semicolon after assert statement inside %!test blocks.
Rik <rik@octave.org>
parents: 27984
diff changeset
286 %! assert (mean (in, "default"), mean (in));
9e43deb9bfc3 maint: Use semicolon after assert statement inside %!test blocks.
Rik <rik@octave.org>
parents: 27984
diff changeset
287 %! assert (mean (in, "default"), out);
9e43deb9bfc3 maint: Use semicolon after assert statement inside %!test blocks.
Rik <rik@octave.org>
parents: 27984
diff changeset
288 %! assert (mean (in, "native"), out); # logical ignores native option
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
289
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
290 ## Test single input and optional arguments "all", DIM, "omitnan")
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
291 %!test
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
292 %! x = [-10:10];
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
293 %! y = [x;x+5;x-5];
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
294 %! assert (mean (x), 0);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
295 %! assert (mean (y, 2), [0, 5, -5]');
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
296 %! assert (mean (y, "all"), 0);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
297 %! y(2,4) = NaN;
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
298 %! assert (mean (y', "omitnan"), [0 5.35 -5]);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
299 %! z = y + 20;
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
300 %! assert (mean (z, "all"), NaN);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
301 %! m = [20 NaN 15];
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
302 %! assert (mean (z'), m);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
303 %! assert (mean (z', "includenan"), m);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
304 %! m = [20 25.35 15];
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
305 %! assert (mean (z', "omitnan"), m);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
306 %! assert (mean (z, 2, "omitnan"), m');
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
307 %! assert (mean (z, 2, "native", "omitnan"), m');
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
308 %! assert (mean (z, 2, "omitnan", "native"), m');
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
309
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
310 ## Test boolean input
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
311 %!test
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
312 %! assert (mean (true, "all"), 1);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
313 %! assert (mean (false), 0);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
314 %! assert (mean ([true false true]), 2/3, 4e-14);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
315 %! assert (mean ([true false true], 1), [1 0 1]);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
316 %! assert (mean ([true false NaN], 1), [1 0 NaN]);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
317 %! assert (mean ([true false NaN], 2), NaN);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
318 %! assert (mean ([true false NaN], 2, "omitnan"), 0.5);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
319 %! assert (mean ([true false NaN], 2, "omitnan", "native"), 0.5);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
320
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
321 ## Test dimension indexing with vecdim in N-dimensional arrays
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
322 %!test
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
323 %! x = repmat ([1:20;6:25], [5 2 6 3]);
31623
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
324 %! assert (size (mean (x, [3 2])), [10 1 1 3]);
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
325 %! assert (size (mean (x, [1 2])), [1 1 6 3]);
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
326 %! assert (size (mean (x, [1 2 4])), [1 1 6]);
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
327 %! assert (size (mean (x, [1 4 3])), [1 40]);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
328 %! assert (size (mean (x, [1 2 3 4])), [1 1]);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
329
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
330 ## Test results with vecdim in N-dimensional arrays and "omitnan"
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
331 %!test
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
332 %! x = repmat ([1:20;6:25], [5 2 6 3]);
31623
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
333 %! m = repmat ([10.5;15.5], [5 1 1 3]);
31421
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
334 %! assert (mean (x, [3 2]), m, 4e-14);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
335 %! x(2,5,6,3) = NaN;
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
336 %! m(2,3) = NaN;
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
337 %! assert (mean (x, [3 2]), m, 4e-14);
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
338 %! m(2,3) = 15.52301255230125;
21962c678648 mean.m: more Matlab compatibility (bugs #58116, #50571).
Andreas Bertsatos <abertsatos@biol.uoa.gr>
parents: 30875
diff changeset
339 %! assert (mean (x, [3 2], "omitnan"), m, 4e-14);
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
340
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
341 ## Test input validation
31623
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
342 %!error <Invalid call> mean ()
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
343 %!error <Invalid call> mean (1, 2, 3)
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
344 %!error <Invalid call> mean (1, 2, 3, 4, 5)
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
345 %!error <Invalid call> mean (1, "all", 3)
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
346 %!error <Invalid call> mean (1, "b")
59422a6fbd91 mean.m: Accept large DIM inputs and calculate Matlab-compatible output (bug #63411)
Rik <rik@octave.org>
parents: 31533
diff changeset
347 %!error <Invalid call> mean (1, 1, "foo")
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
348 %!error <X must be either a numeric or logical> mean ({1:5})
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
349 %!error <X must be either a numeric or logical> mean ("char")
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
350 %!error <DIM must be a positive integer> mean (1, ones (2,2))
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
351 %!error <DIM must be a positive integer> mean (1, 1.5)
31525
24ca5cb70a4a mean.m: improve error handling for dim input (bug #63410)
Nicholas R. Jankowski <jankowski.nicholas@gmail.com>
parents: 31511
diff changeset
352 %!error <DIM must be a positive integer> mean (1, -1)
24ca5cb70a4a mean.m: improve error handling for dim input (bug #63410)
Nicholas R. Jankowski <jankowski.nicholas@gmail.com>
parents: 31511
diff changeset
353 %!error <DIM must be a positive integer> mean (1, -1.5)
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
354 %!error <DIM must be a positive integer> mean (1, 0)
31525
24ca5cb70a4a mean.m: improve error handling for dim input (bug #63410)
Nicholas R. Jankowski <jankowski.nicholas@gmail.com>
parents: 31511
diff changeset
355 %!error <DIM must be a positive integer> mean (1, NaN)
24ca5cb70a4a mean.m: improve error handling for dim input (bug #63410)
Nicholas R. Jankowski <jankowski.nicholas@gmail.com>
parents: 31511
diff changeset
356 %!error <DIM must be a positive integer> mean (1, Inf)
31511
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
357 %!error <DIM must index at least N-2 dimensions of X>
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
358 %! mean (repmat ([1:20;6:25], [5 2 6 3 5]), [1 2])
9ee8943cad01 mean.m: Use Octave coding conventions.
Rik <rik@octave.org>
parents: 31421
diff changeset
359