LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
moment_joint_raw_from_cumulant.m
1function m = moment_joint_raw_from_cumulant(kappa)
2% m = moment_joint_raw_from_cumulant(kappa)
3%
4% Converts the joint cumulants of a random vector into its joint power (raw)
5% moments, by running the multivariate exponential-formula recursion forward,
6%
7% m_a = sum_(0<b<=a) prod_l nchoosek(a_l-[l=j], b_l-[l=j]) kappa_b m_(a-b)
8%
9% with m_0 = 1 and j the first dimension in which a is nonzero. Inverse of
10% moment_joint_cumulant_from_raw.
11%
12% Input:
13% kappa: array of size (n_1+1)x...x(n_d+1) holding the joint cumulants;
14% element 1 is ignored
15%
16% Output:
17% m: array of the same size holding the joint power moments, element 1 being
18% 1
19%
20% Example:
21% m = moment_joint_raw_from_cumulant(moment_joint_cumulant_from_raw(m0));
22%
23% Reference:
24% V. P. Leonov and A. N. Shiryaev. On a method of calculation of
25% semi-invariants. Theory of Probability and its Applications,
26% 4(3):319-329, 1959.
27
28sz = moment_tensorsize(kappa);
29d = numel(sz);
30nel = prod(sz);
31stride = cumprod([1, sz(1:end-1)]);
32kv = reshape(kappa, [], 1);
33mv = zeros(nel,1);
34mv(1) = 1;
35a = ones(1,d);
36for ia = 1:nel
37 if any(a > 1)
38 j = find(a > 1, 1);
39 acc = 0;
40 b = ones(1,d);
41 for ib = 1:prod(a)
42 if any(b > 1) && b(j) > 1
43 c = 1;
44 for l = 1:d
45 alpha = a(l) - 1 - (l == j);
46 beta = b(l) - 1 - (l == j);
47 c = c * nchoosek(alpha, beta);
48 end
49 if c ~= 0
50 acc = acc + c * kv(1 + sum((b-1).*stride)) * mv(1 + sum((a-b).*stride));
51 end
52 end
53 for l = 1:d
54 b(l) = b(l) + 1;
55 if b(l) <= a(l)
56 break
57 end
58 b(l) = 1;
59 end
60 end
61 mv(ia) = acc;
62 end
63 for l = 1:d
64 a(l) = a(l) + 1;
65 if a(l) <= sz(l)
66 break
67 end
68 a(l) = 1;
69 end
70end
71m = reshape(mv, size(kappa));
72end