-
Notifications
You must be signed in to change notification settings - Fork 10
/
covellipsoid.m
53 lines (45 loc) · 1.39 KB
/
covellipsoid.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
function [] = covellipsoid(U, L, M, speed, Dir, time)
%% C: the covariance matrix.
%% Dir: direction of the estimate, to be plotted together with the DT ellipsoid.
%% M: the mean vector, usually 0 in case of DT.
%% speed: time to pause between plotting, lowervalue = faster.
%% Dir: 1 or -1 for clockwise, anticlockwise.
%% time: number of iterations for which rotation is needed, higher = longer.
%% example: visualizeDTrot(diag([17 2 2]),[0 0 0],0.4,1,100)
% For N standard deviations spread of data, the radii of the eliipsoid will
% be given by N*SQRT(eigenvalues).
N = 1; % choose your own N
radii = N * sqrt(diag(L));
% generate data for "unrotated" ellipsoid
[xc, yc, zc] = ellipsoid(0, 0, 0, radii(1), radii(2), radii(3));
% rotate data with orientation matrix U and center M
a = kron(U(:, 1), xc);
b = kron(U(:, 2), yc);
c = kron(U(:, 3), zc);
data = a + b + c;
n = size(data, 2);
x = data(1:n, :) + M(1);
y = data(n+1:2*n, :) + M(2);
z = data(2*n+1:end, :) + M(3);
% now plot the rotated ellipse
if Dir == 1
i = 1:time;
else
i = time:-1:1;
end
for j = i
sc = surf(x, y, z);
colormap copper
shading interp
zdir = [1, 0, 0];
axis equal
% rotate(sc,zdir,j)
% pause(speed)
title('actual ellipsoid represented by data: C and M')
axis equal
xlabel('x axis ---->')
ylabel('y axis ---->')
zlabel('z axis ---->')
alpha(0.5)
end
%% This should do the job!