-
Notifications
You must be signed in to change notification settings - Fork 6
/
transforma.m
73 lines (61 loc) · 1.97 KB
/
transforma.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
function [At,p,pinv] = transforma(A)
% Transforms an arbitrary feasible vine array A to an ordered vine array,
% i.e., such that the diagonal entries a_jj of A satisfy a_jj = j.
%
% call: [At,p,pinv] = transforma(A)
%
% input A - feasible vine array
%
% output At - ordered vine array, diagonal entries satisfy
% at_jj = j
% p - the permutation of variables that yields the
% transformed vine array
% pinv - the inverse of permutation p
%
% How does it work?
% The function transforms an arbitrary vine array A to an ordered vine
% array which satisfies a_jj = j on its diagonal entries a_jj. For this
% the entries in A are permuted. This is equivalent to a
% renumbering/relabeling of the vine structure. The permutation for the
% renumbering is given in the output p, which contains the unsorted
% diagonal elements of A in the first column and the new labels in the
% second column.
%
% In order to transform the columns of data u to reflect the renumbering,
% one can use
% ut = u(:,p(:,1));
%
% Compliance between u and the diagonal elements of A is, e.g., needed for
% llrvine when comparing models.
%
% To reverse the permutation, i.e., to recover the original u, one can use
% u = ut(:,pinv(:,2));
%
%
% Copyright 2020, Maximilian Coblenz
% This code is released under the 3-clause BSD license.
%
% some parsing
p = inputParser;
p.addRequired('vineArray',@ismatrix);
p.parse(A);
% some sanity checks for vine array A
if (size(A,1) ~= size(A,2))
error('transforma:InvalidVineArray','vine array A has to be a quadratic matrix');
end
for jj = 1:1:size(A,1)
if (length(unique(A(1:jj,jj))) ~= jj)
error('transforma:InvalidVineArray','input A is not a vine array');
end
end % jj
% initialize variables
d = size(A,1);
At = A;
% generate permutation
p = [diag(A) (1:d)'];
pinv = sortrows(p);
% transform A to At
for ii = 1:1:d
At(1:ii,ii) = pinv(A(1:ii,ii),2);
end % ii
end