Statistics: scalar a priori mean for hypermatrices in stdev
[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 // This file must be used under the terms of the CeCILL.
5 // This source file is licensed as described in the file COPYING, which
6 // you should have received as part of this distribution.  The terms
7 // are also available at
8 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
9
10 function x = %hm_stdev(m, d, ms)
11
12     if argn(2) < 3 then
13         ms = %f
14     end
15     if argn(2) == 3 & type(ms)~=1 & typeof(ms) ~= "hypermat" then
16         error(msprintf(_("%s: Wrong type for input argument #%d: A real matrix expected.\n"),"stdev",3));
17     end
18     if argn(2) == 1 | d == "*" then
19         if argn(2) == 3 then
20             x = stdev(m.entries, "*", ms);
21         else
22             x = stdev(m.entries, "*");
23         end
24         return
25     elseif d == "r" then
26         d = 1;
27     elseif d == "c" then
28         d = 2;
29     end
30     dims = double(m.dims);
31     if d > size(m,d) then
32         x = zeros(m);
33         return
34     end
35     N = size(dims, "*");
36     p1 = prod(dims(1:d-1));// step to build one vector on which stdev is applied
37     p2 = p1*dims(d);//step for beginning of next vectors
38     ind = (0:p1:p2-1)';// selection for building one vector
39     deb = (1:p1);
40     I = ind*ones(deb)+ones(ind)*deb;
41
42     ind = (0:p2:prod(dims)-1);
43     I = ones(ind).*.I+ind.*.ones(I);
44
45     if argn(2) == 3 then
46         if isscalar(ms) then
47             x = stdev(matrix(m.entries(I),dims(d),-1), 1, ms);
48         else
49             x = stdev(matrix(m.entries(I),dims(d),-1), 1, ms.entries');
50         end
51     else
52         x = stdev(matrix(m.entries(I),dims(d),-1), 1);
53     end
54     dims(d) = 1;
55     if d == N then
56         dims = dims(1:$)
57     else
58         dims(d) = 1
59     end
60     if size(dims, "*") == 2 then
61         x = matrix(x, dims(1), dims(2))
62     else
63         x = hypermat(dims, x)
64     end
65
66 endfunction