c92926e713dee4c9f10af8c9f3f7b66741ab9d66
[scilab.git] / scilab / modules / overloading / macros / %hm_stdev.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 //
4 // Copyright (C) 2012 - 2016 - Scilab Enterprises
5 //
6 // This file is hereby licensed under the terms of the GNU GPL v2.0,
7 // pursuant to article 5.3.4 of the CeCILL v.2.1.
8 // This file was originally licensed under the terms of the CeCILL v2.1,
9 // and continues to be available under such terms.
10 // For more information, see the COPYING file which you should have received
11 // along with this program.
12
13 function x = %hm_stdev(m, d, ms)
14
15     if argn(2) < 3 then
16         ms = %f
17     end
18     if argn(2) == 3 & type(ms)~=1 & typeof(ms) ~= "hypermat" then
19         error(msprintf(_("%s: Wrong type for input argument #%d: A real matrix expected.\n"),"stdev",3));
20     end
21     if argn(2) == 1 | d == "*" then
22         if argn(2) == 3 then
23             x = stdev(m(:), "*", ms);
24         else
25             x = stdev(m(:), "*");
26         end
27         return
28     elseif d == "r" then
29         d = 1;
30     elseif d == "c" then
31         d = 2;
32     end
33     dims = size(m);
34     if d > size(m,d) then
35         x = zeros(m);
36         return
37     end
38     N = size(dims, "*");
39     p1 = prod(dims(1:d-1));// step to build one vector on which stdev is applied
40     p2 = p1*dims(d);//step for beginning of next vectors
41     ind = (0:p1:p2-1)';// selection for building one vector
42     deb = (1:p1);
43     I = ind*ones(deb)+ones(ind)*deb;
44
45     ind = (0:p2:prod(dims)-1);
46     I = ones(ind).*.I+ind.*.ones(I);
47
48     if argn(2) == 3 then
49         if isscalar(ms) then
50             x = stdev(matrix(m(I),dims(d),-1), 1, ms);
51         else
52             x = stdev(matrix(m(I),dims(d),-1), 1, ms(:)');
53         end
54     else
55         x = stdev(matrix(m(I),dims(d),-1), 1);
56     end
57     dims(d) = 1;
58     if d == N then
59         dims = dims(1:$)
60     else
61         dims(d) = 1
62     end
63     if size(dims, "*") == 2 then
64         x = matrix(x, dims(1), dims(2))
65     else
66         x = hypermat(dims, x)
67     end
68
69 endfunction