%21.04.2022
%Vytvoreni Sugeno modelu pro všechny řidiče
clc
clear
close all
clear global

vystup_dir = '.\Documents\';
All_spline_vzdal = load('.\Data\All_SplineMean.csv');
All_wheel_angle = load('.\Data\All_WheelAngleMean.csv');
All_wheel_angle = All_wheel_angle.*900;  %hodnota je ve stupnich

Optimal_dir = '.\Optimal\'; %slozka kde jsou optimalizovane modely pro vsechny 38 ridice

%oprava chybnych hodnot u zaznamu rizeni - dame prumernou hodnotu
values = sort(All_wheel_angle(1,:));  %2x hodnota -5
values(1:10)
ix_min1 = find(All_wheel_angle(1,:) == min(All_wheel_angle(1,:)));
for i = 1:length(ix_min1)
   All_wheel_angle(1,ix_min1(i))= mean([All_wheel_angle(1,ix_min1(i)-1) All_wheel_angle(1,ix_min1(i)+1)]);   
end

values = sort(All_wheel_angle(23,:)); %2x hodnota 5
values(740:751)
ix_max23 = find(All_wheel_angle(23,:) == max(All_wheel_angle(23,:)));
for i = 1:length(ix_max23)
   All_wheel_angle(23,ix_max23(i))= mean([All_wheel_angle(1,ix_max23(i)-1) All_wheel_angle(1,ix_max23(i)+1)]);
end

values = sort(All_wheel_angle(38,:));  %hodnota -5
values(1:10)
ix_min38 = find(All_wheel_angle(38,:) == min(All_wheel_angle(38,:)));
for i = 1:length(ix_min38)
   All_wheel_angle(38,ix_min38(i))= mean([All_wheel_angle(1,ix_min38(i)-1) All_wheel_angle(1,ix_min38(i)+1)]);
end

%Zobrazeni uhlu natoceni pro vsechny ridice 38
plot(1:751, All_wheel_angle,'linewidth',1.3);
grid on;
title('Úhel natočení volantu v čase, pro všechny řidiče');
xlabel('Čas [Vzorek x 20 ms]');
ylabel('Úhel natočení volantu [{\circ}]');
saveas(gcf,sprintf("%sclust_sug_all_volant.png",vystup_dir));

%Zobrazeni vzdalenosti od spline vsechny ridice 38
plot(1:751, All_spline_vzdal,'linewidth',1.3);
grid on;
title('Vzdálenost od spline v čase, pro všechny řidiče');
xlabel('Čas [Vzorek x 20 ms]');
ylabel('Vzdálenost od spline [m]');
saveas(gcf,sprintf("%sclust_sug_all_spline.png",vystup_dir));

%celkovy prumer pro vytvoreni vystupnich linearnich funkci
mean_Spline = mean(All_spline_vzdal);

plot(1:751, mean_Spline,'linewidth',2,'color','blue');
grid on;
title('Průměrná vzdálenost od spline v čase, pro všechny řidiče');
xlabel('Čas [Vzorek x 20 ms]');
ylabel('Vzdálenost od spline [m]');
saveas(gcf,sprintf("%sclust_sug_mean_spline.png",vystup_dir));

%prumerne natoceni od spline
mean_Angle = mean(All_wheel_angle);

plot(1:751, mean_Angle,'color','blue','linewidth',2);
grid on;
title('Průměrný úhel natočení volantu v čase, pro všechny řidiče');
xlabel('Čas [Vzorek x 20 ms]');
ylabel('Úhel natočení volantu [{\circ}]');
saveas(gcf,sprintf("%sclust_sug_mean_volant.png",vystup_dir));

%vytvorime koeficienty pro linearni funkce na vystupu FIS na zaklade
%prumeru nalezeno rucne z prechodove charakterisiky
body_primek_x = [0.26082,0.281282; 0.221405,1.456938; 1.096494,2.41825; 2.125,3.58228; 3.50339,3.52858];
body_primek_y = [1.218314,-3.54056; -2.4496,-8.62085; -8.623555,-4.16386; -6.50468,16.168; 16.168,-1.20091];

plot(mean_Spline,mean_Angle,'linewidth',2,'color','blue');
grid on;
title('Průměrná závislost úhlu natočení volantu na vzdálenosti od spline');
subtitle('Přiřazení výstupních funkcí pravidel');
xlabel('Vzdálenost od spline [m]');
ylabel('Úhel natočení volantu [{\circ}]');
hold on
line(body_primek_x(1,:),body_primek_y(1,:),'color','red','linewidth',1.5);
hold on
line(body_primek_x(2,:),body_primek_y(2,:),'color','red','linewidth',1.5);
hold on
line(body_primek_x(3,:),body_primek_y(3,:),'color','red','linewidth',1.5);
hold on
line(body_primek_x(4,:),body_primek_y(4,:),'color','red','linewidth',1.5);
hold on
line(body_primek_x(5,:),body_primek_y(5,:),'color','red','linewidth',1.5);
saveas(gcf,sprintf("%sclust_sug_mean_prev.png",vystup_dir));

%koeficienty k a q pro každou přímku -  vystupni funkci y=kx+q
coef_p1 = polyfit(body_primek_x(1,:),body_primek_y(1,:),1);
coef_p2 = polyfit(body_primek_x(2,:),body_primek_y(2,:),1);
coef_p3 = polyfit(body_primek_x(3,:),body_primek_y(3,:),1);
coef_p4 = polyfit(body_primek_x(4,:),body_primek_y(4,:),1);
coef_p5 = polyfit(body_primek_x(5,:),body_primek_y(5,:),1);

%Vytvorime FIS sugeno pro kazdeho ridice

%FIS pro prumerny prubeh
minmaxI = [min(mean_Spline) max(mean_Spline)]; 
minmaxO = [min(mean_Angle) max(mean_Angle)]; 
fis_mean = make_raw_fis_sug(minmaxI, minmaxO,body_primek_x);

fis_mean = napln_fis_primkyS(fis_mean,body_primek_x,body_primek_y);
fis_eval = evalfis(fis_mean,mean_Spline);

%prechodova charakteristika
plot(mean_Spline,mean_Angle,'color','blue','linewidth',1.5);
hold on
plot(mean_Spline,fis_eval,'color','red','linewidth',1.5);

%casova charakteristika
plot(1:751,mean_Angle,'color','blue','linewidth',1.5);
hold on
plot(1:751,fis_eval,'color','red','linewidth',1.5);

% **** Pro kazdy FIS provedeme PSO na vstupni funkce prislusnosti a vahy **
%Ladime pomoci PSO na nejlepsi vysledek -> nejmensi RMSE
%definovane zakladni hodnoty odvozene od zlomu primek

global zakl_hodnoty;
global fss;
global vahy;
global data_wheel;
global data_spline;

vstup_ix = 1; 
%vstup_ix = 2; 
%vstup_ix = 3; 
%vstup_ix = 4;

if (vstup_ix==1)
    ridici=[1 2 3 4 5 6 7 8 9];
    indexy_Rid = "1_9";
elseif (vstup_ix==2)
    ridici=[10 11 12 13 14 15 16 17 18];
    indexy_Rid = "10_18";
elseif (vstup_ix==3)
    ridici=[19 20 21 22 23 24 25 26 27];    
    indexy_Rid = "19_27";
elseif (vstup_ix==4)
    ridici=[28 29 30 31 32 33 34 35 36 37 38];
    indexy_Rid = "28_38";
end

Celkove_Vysledky = {size(All_spline_vzdal,1),4}; %38 ridicu, matice tf, info tf, matice vah, info vah
%for ridic = ridici %1:size(All_spline_vzdal,1)
%paralelni spusteni vypoctu PSO bez zaruceni poradi 
parpool(12);
parfor ridic = 1:size(All_spline_vzdal,1)    
    %data jednotlivych ridicu
    data_wheel = All_wheel_angle(ridic,:);
    data_spline = All_spline_vzdal(ridic,:);
        
    pole_koef = zeros(10,15);
    info_koef = zeros(10,2);
    pole_vah = zeros(10,5);
    info_vah = zeros(10,2);

    pocet_cyklu = 10;
    warning('off');
    rng(123456); %nastaveni RNG pro reprodukovatelnost
    for c = 1:pocet_cyklu    
        %leva,stred,prava,sirka_zmeny
        zakl_hodnoty = [ body_primek_x(1,1) mean(body_primek_x(1,:)) body_primek_x(1,2) body_primek_x(1,2) ...
                         body_primek_x(2,1) mean(body_primek_x(2,:)) body_primek_x(2,2) body_primek_x(2,2)-body_primek_x(2,1) ...
                         body_primek_x(3,1) mean(body_primek_x(3,:)) body_primek_x(3,2) body_primek_x(3,2)-body_primek_x(3,1) ...
                         body_primek_x(4,1) mean(body_primek_x(4,:)) body_primek_x(4,2) body_primek_x(4,2)-body_primek_x(4,1) ...
                         body_primek_x(5,1) mean(body_primek_x(5,:)) body_primek_x(5,2) body_primek_x(5,2)-body_primek_x(5,1)];                 
        nastaveni = [0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5];
        vahy = [1 1 1 1 1];
        
        %FIS pro prumerny prubeh
        minmaxI = [min(data_spline) max(data_spline)]; 
        minmaxO = [min(data_wheel) max(data_wheel)]; 
        fis_mean = make_raw_fis_sug(minmaxI, minmaxO, body_primek_x);
        fis_mean = napln_fis_primkyS(fis_mean,body_primek_x,body_primek_y);

        fss = fis_mean; %vytvoreny FIS
        fss = ComputeIntMF(fss, nastaveni, zakl_hodnoty);
        fss = nastav_vahy(fss,vahy);

        [BestSol BestRMSE timePSO]= DoPSO();
        pole_koef(c,:) = BestSol.Position;
        info_koef(c,:) = [BestRMSE, timePSO];

        %nastavime fss na nejlepsi nastaveni z funkci prislusnosti
        fss = ComputeIntMF(fss, BestSol.Position, zakl_hodnoty);
        fss = nastav_vahy(fss,vahy);
        %--------------------------------------------------------------------------
        %Ted dame dalsi PSO a to na vahy jednotlivych vystupnich funkci
        %rng(18042022); %nastaveni RNG pro reprodukovatelnost
        [BestSol_w BestRMSE_w timePSO_w]= DoPSO_Weight();
        pole_vah(c,:) = BestSol_w.Position;
        info_vah(c,:) = [BestRMSE_w, timePSO_w];
        disp(sprintf("*** Iterace: %d ... RMSE tvf: %f  RMSE vaha: %f",c,BestRMSE,BestRMSE_w));  
    end %hlavni cyklus 100x PSO FP a pro kazdy nejlepsi 100x PSO vahy
    Celkove_Vysledky{ridic,1}=pole_koef;
    Celkove_Vysledky{ridic,2}=info_koef;
    Celkove_Vysledky{ridic,3}=pole_vah;
    Celkove_Vysledky{ridic,4}=info_vah;
end %38 ridicu
save(sprintf("%sRidici_%s.mat",vystup_dir,indexy_Rid),'Celkove_Vysledky');
save(sprintf("%sEnvRidici_%s.mat",vystup_dir,indexy_Rid));
%**************************************************************************
% zpracovani optimalizovanych FIS *****************************************
%**************************************************************************

%nacteme vysledky optimalizace pro vsech 38 ridicu
optimal_1=load(sprintf("%sRidici_%s.mat",Optimal_dir,"1_9"));
optimal_2=load(sprintf("%sRidici_%s.mat",Optimal_dir,"10_18"));
optimal_3=load(sprintf("%sRidici_%s.mat",Optimal_dir,"19_27"));
optimal_4=load(sprintf("%sRidici_%s.mat",Optimal_dir,"28_38"));

Total_Optim = {38,2};

Low_RMSE_vahy = zeros(1,38);
Low_RMSE_fnc = zeros(1,38);
%najdeme nejlepsi RMSE index
for i=1:9
  Total_Optim(i,1)=optimal_1.Celkove_Vysledky(i,1); %funkce prislusnosti 10x15
  Total_Optim(i,2)=optimal_1.Celkove_Vysledky(i,3); %vahy 10x5 pro kazde pravidlo
  vf = optimal_1.Celkove_Vysledky{i,2}(:,1);
  vv = optimal_1.Celkove_Vysledky{i,4}(:,1);
  ix_vv = find(vv==min(vv));
  ix_vf = find(vf==min(vf));
  Low_RMSE_vahy(1,i) = ix_vv(1,1);
  Low_RMSE_fnc(1,i) = ix_vf(1,1);
end

for i=10:18
  Total_Optim(i,1)=optimal_2.Celkove_Vysledky(i,1); %funkce prislusnosti 10x15
  Total_Optim(i,2)=optimal_2.Celkove_Vysledky(i,3); %vahy 10x5 pro kazde pravidlo
  ix_vv = find(vv==min(vv));
  ix_vf = find(vf==min(vf));
  Low_RMSE_vahy(1,i) = ix_vv(1,1);
  Low_RMSE_fnc(1,i) = ix_vf(1,1);
end

for i=19:27
  Total_Optim(i,1)=optimal_3.Celkove_Vysledky(i,1); %funkce prislusnosti 10x15
  Total_Optim(i,2)=optimal_3.Celkove_Vysledky(i,3); %vahy 10x5 pro kazde pravidlo
  ix_vv = find(vv==min(vv));
  ix_vf = find(vf==min(vf));
  Low_RMSE_vahy(1,i) = ix_vv(1,1);
  Low_RMSE_fnc(1,i) = ix_vf(1,1);
end

for i=28:38
  Total_Optim(i,1)=optimal_4.Celkove_Vysledky(i,1); %funkce prislusnosti 10x15
  Total_Optim(i,2)=optimal_4.Celkove_Vysledky(i,3); %vahy 10x5 pro kazde pravidlo
  ix_vv = find(vv==min(vv));
  ix_vf = find(vf==min(vf));
  Low_RMSE_vahy(1,i) = ix_vv(1,1);
  Low_RMSE_fnc(1,i) = ix_vf(1,1);
end

Data_shluk = zeros(38,21); %data ke shlukovani vybrane nejlepsi aproximace

for i =1:38
    Data_shluk(i,1)=i;
    Data_shluk(i,2:16)=Total_Optim{i,1}(Low_RMSE_fnc(1,i),:);
    Data_shluk(i,17:21)=Total_Optim{i,2}(Low_RMSE_vahy(1,i),:);
end

%-------------------------------------------------------------------------
%Data_Shluk obsahuji ID, 15 x nastaveni FP a 5 x nastaveni vahy
%-------------------------------------------------------------------------

body_primek_x = [0.26082,0.281282; 0.221405,1.456938; 1.096494,2.41825; 2.125,3.58228; 3.50339,3.52858];
body_primek_y = [1.218314,-3.54056; -2.4496,-8.62085; -8.623555,-4.16386; -6.50468,16.168; 16.168,-1.20091];

zakl_hodnoty = [ body_primek_x(1,1) mean(body_primek_x(1,:)) body_primek_x(1,2) body_primek_x(1,2) ...
                 body_primek_x(2,1) mean(body_primek_x(2,:)) body_primek_x(2,2) body_primek_x(2,2)-body_primek_x(2,1) ...
                 body_primek_x(3,1) mean(body_primek_x(3,:)) body_primek_x(3,2) body_primek_x(3,2)-body_primek_x(3,1) ...
                 body_primek_x(4,1) mean(body_primek_x(4,:)) body_primek_x(4,2) body_primek_x(4,2)-body_primek_x(4,1) ...
                 body_primek_x(5,1) mean(body_primek_x(5,:)) body_primek_x(5,2) body_primek_x(5,2)-body_primek_x(5,1)];                 

%Vytvoreni zakladni FIS Sugeno
minmaxI = [min(mean_Spline) max(mean_Spline)]; 
minmaxO = [min(mean_Angle) max(mean_Angle)]; 
fis_test = make_raw_fis_sug(minmaxI, minmaxO, body_primek_x);
fis_test = napln_fis_primkyS(fis_test,body_primek_x,body_primek_y);

%Testovaci zobrazeni pro evaluaci optimalizovaneho FIS
index = 1;
fss = ComputeIntMF(fis_test, Data_shluk(index,2:16), zakl_hodnoty);
fss = nastav_vahy(fss,Data_shluk(index,17:21));

fis_eval = evalfis(fss,mean_Spline);

%prechodova charakteristika
plot(All_spline_vzdal(index,:),All_wheel_angle(index,:),'color','blue','linewidth',1.5);
hold on
plot(All_spline_vzdal(index,:),fis_eval,'color','red','linewidth',1.5);

%time charakteristika
plot(1:751,All_wheel_angle(index,:),'color','blue','linewidth',1.5);
hold on
plot(1:751,fis_eval,'color','red','linewidth',1.5);

%------------------ Shlukovani --------------------------------------------
%Shlukovani pomoci K-means pouze nad koeficienty FIS
%Zjisteni optimalniho poctu shluku
rng('default');
klist=2:10; %rozsah testu
myfunc = @(X,K)(kmeans(X, K,'Distance','sqeuclidean'));
eva = evalclusters(Data_shluk(:,2:21),myfunc,'CalinskiHarabasz','klist',klist)

%ruzne metody metody vzdalenosti
ix_met=1; %defaultni metrika euklidean
met_vzdal=["sqeuclidean","cosine","correlation"];

%Nalezeni nejlepsich shluku v poctu odhadnutem v predchozim kroku
stream = RandStream('mlfg6331_64');  % stream nahodnych cisel pro generovani seeds
options = statset('UseParallel',1,'UseSubstreams',1,'Streams',stream); 
diary(sprintf("%sclust_sug_FIS_console.txt",vystup_dir));
tic; % Start stopwatch timer
[idx,C,sumd,D] = kmeans(Data_shluk(:,2:21),eva.OptimalK,'Options',options,'MaxIter',10000,...
    'Display','final','Replicates',100,'Distance',met_vzdal(ix_met));
toc
diary('off');
figure(1);
silhouette(Data_shluk(:,2:21),idx);
title('Silhouette plot')
subtitle('3 shluky nad hyperparametry FIS pro všechny řidiče');
xlabel('Hodnota silhouette indexu [-]');
ylabel('Shluk');
saveas(gcf,sprintf("%sclust_sug_silhouette_FIS.png",vystup_dir));
save(sprintf("%sclust_index_FIS_final.mat",vystup_dir),'idx');

%Zorazeni pruběhů patřících do nalezených shluků
shluk1_data = All_wheel_angle(find(idx==1),:);
shluk2_data = All_wheel_angle(find(idx==2),:);
shluk3_data = All_wheel_angle(find(idx==3),:);

figure(1)
grid on;
plot(1:751,shluk1_data, 'color','black');
ylim([-30 30]);
title('Průběh natočení volantu v čase')
subtitle('Skupina řidičů patřících do shluku 1');
xlabel('Čas [Vzorek x 20 ms]');
ylabel('Úhel natočení volantu [{\circ}]');
saveas(gcf,sprintf("%sclust_sug_clust1_FIS.png",vystup_dir));

figure(2)
grid on;
plot(1:751,shluk2_data, 'color','red')
ylim([-30 30]);
title('Průběh natočení volantu v čase')
subtitle('Skupina řidičů patřících do shluku 2');
xlabel('Čas [Vzorek x 20 ms]');
ylabel('Úhel natočení volantu [{\circ}]');
saveas(gcf,sprintf("%sclust_sug_clust2_FIS.png",vystup_dir));

figure(3)
grid on;
plot(1:751,shluk3_data, 'color','blue')
ylim([-30 30]);
title('Průběh natočení volantu v čase')
subtitle('Skupina řidičů patřících do shluku 3');
xlabel('Čas [Vzorek x 20 ms]');
ylabel('Úhel natočení volantu [{\circ}]');
saveas(gcf,sprintf("%sclust_sug_clust3_FIS.png",vystup_dir));

%zobrazime profily ze shluku
shluk1_mean = mean(shluk1_data);
shluk2_mean = mean(shluk2_data);
shluk3_mean = mean(shluk3_data);

grid on;
plot(1:751,shluk1_mean, 'color','black','linewidth',2);
ylim([-20 30]);
title('Profily natočení volantu pro jednotlivé shluky')
xlabel('Čas [Vzorek x 20 ms]');
ylabel('Úhel natočení volantu [{\circ}]');
hold on;
grid on;
plot(1:751,shluk2_mean, 'color','red','linewidth',2);
hold on;
grid on;
plot(1:751,shluk3_mean, 'color','blue','linewidth',2);
legend('Shluk 1','Shluk 2','Shluk 3','Location','southeast');
saveas(gcf,sprintf("%sclust_sug_profiles_FIS.png",vystup_dir));
%--------------------------------------------------------------------------
%shlukovani celych originalnich dat pro porovnani vysledku
%--------------------------------------------------------------------------
%Shlukovani pomoci K-means pomoci originalnich dat velikosti 1x751
%zjisteni poctu shluku

rng('default');
%klist=2:10; %rozsah testu stejne jako u FIS
myfuncO = @(X,K)(kmeans(X, K,'Distance','sqeuclidean'));

evaO = evalclusters(All_wheel_angle,myfuncO,'CalinskiHarabasz','klist',klist)
pocet_shlukuO = evaO.OptimalK;

streamO = RandStream('mlfg6331_64');  % stream nahodnych cisel pro generovani seeds
optionsO = statset('UseParallel',1,'UseSubstreams',1,'Streams',stream); 
diary(sprintf("%sclust_sug_origdata_console.txt",vystup_dir));
tic; % Start stopwatch timer
[idxO,CO,sumdO,DO] = kmeans(All_wheel_angle,pocet_shlukuO,'Options',options,'MaxIter',10000,...
    'Display','final','Replicates',100,'Distance',met_vzdal(ix_met));
toc
diary('off');

figure(1);
silhouette(All_wheel_angle,idxO);
title('Silhouette plot')
subtitle('5 shluku nad změřenými daty pro všechny řidiče');
xlabel('Hodnota silhouette indexu [-]');
ylabel('Shluk');
saveas(gcf,sprintf("%sclust_sug_silhouette_origdata.png",vystup_dir));
save(sprintf("%sclust_index_origdata_final.mat",vystup_dir),'idxO');

%Zorazeni pruběhů patřících do nalezených shluků
shluk1_dataO = All_wheel_angle(find(idxO==1),:);
shluk2_dataO = All_wheel_angle(find(idxO==2),:);
shluk3_dataO = All_wheel_angle(find(idxO==3),:);
shluk4_dataO = All_wheel_angle(find(idxO==4),:);
shluk5_dataO = All_wheel_angle(find(idxO==5),:);

figure(1)
grid on;
plot(1:751,shluk1_dataO, 'color','black');
ylim([-30 30]);
title('Průběh natočení volantu v čase')
subtitle('Skupina řidičů patřících do shluku 1');
xlabel('Čas [Vzorek x 20 ms]');
ylabel('Úhel natočení volantu [{\circ}]');
saveas(gcf,sprintf("%sclust_sug_clust1_orig.png",vystup_dir));

figure(2)
grid on;
plot(1:751,shluk2_dataO, 'color','red')
ylim([-30 30]);
title('Průběh natočení volantu v čase')
subtitle('Skupina řidičů patřících do shluku 2');
xlabel('Čas [Vzorek x 20 ms]');
ylabel('Úhel natočení volantu [{\circ}]');
saveas(gcf,sprintf("%sclust_sug_clust2_orig.png",vystup_dir));

figure(3)
grid on;
plot(1:751,shluk3_dataO, 'color','blue')
ylim([-30 30]);
title('Průběh natočení volantu v čase')
subtitle('Skupina řidičů patřících do shluku 3');
xlabel('Čas [Vzorek x 20 ms]');
ylabel('Úhel natočení volantu [{\circ}]');
saveas(gcf,sprintf("%sclust_sug_clust3_orig.png",vystup_dir));

figure(4)
grid on;
plot(1:751,shluk4_dataO, 'color','green')
ylim([-30 30]);
title('Průběh natočení volantu v čase')
subtitle('Skupina řidičů patřících do shluku 4');
xlabel('Čas [Vzorek x 20 ms]');
ylabel('Úhel natočení volantu [{\circ}]');
saveas(gcf,sprintf("%sclust_sug_clust4_orig.png",vystup_dir));

figure(5)
grid on;
plot(1:751,shluk5_dataO, 'color','magenta')
ylim([-30 30]);
title('Průběh natočení volantu v čase')
subtitle('Skupina řidičů patřících do shluku 5');
xlabel('Čas [Vzorek x 20 ms]');
ylabel('Úhel natočení volantu [{\circ}]');
saveas(gcf,sprintf("%sclust_sug_clust5_orig.png",vystup_dir));

%Zobrazeni prumeru jednotlivych shluku z originalnich dat ----------------
shluk1_meanO = mean(shluk1_dataO);
shluk2_meanO = shluk2_dataO;  %pouze jeden ridic
shluk3_meanO = mean(shluk3_dataO);
shluk4_meanO = shluk4_dataO;  %pouze jeden ridic
shluk5_meanO = mean(shluk5_dataO);

grid on;
plot(1:751,shluk1_meanO, 'color','black','linewidth',2);
ylim([-40 60]);
title('Profily natočení volantu pro jednotlivé shluky')
xlabel('Čas [Vzorek x 20 ms]');
ylabel('Úhel natočení volantu [{\circ}]');

hold on;
grid on;
plot(1:751,shluk2_meanO, 'color','red','linewidth',2);

hold on;
grid on;
plot(1:751,shluk3_meanO, 'color','blue','linewidth',2);

hold on;
grid on;
plot(1:751,shluk4_meanO, 'color','green','linewidth',2);

hold on;
grid on;
plot(1:751,shluk5_meanO, 'color','magenta','linewidth',2);

legend('Shluk 1','Shluk 2','Shluk 3','Shluk 4','Shluk 5','Location','southeast');
saveas(gcf,sprintf("%sclust_sug_profiles_orig.png",vystup_dir));
