function [ysost,sredn,stdotklon_group,stdotklon_all,matrix_kol,num_group]=dy2sost(dydiscr,numsost,r,dx,tbeg_sost,tend_sost);
% процедура преобразования массива дискретизированных приращений в номера
% событий. Использует равномерное разбитие на события.
global type_raspr;
if isempty(type_raspr)
    ver1=0;
else
    ver1=type_raspr;
end
%ver1=0;%wersiya raboty s poryadkom kwantovaniya: 0-tradic (delim otsortir masiv) 1 - delim interwal znacheniy dy
if tend_sost>length(dydiscr) %Защита от дурака, если невозможно получить диапазон состояний.
    tend_sost=length(dydiscr);
end
dydiscrsort=sort(dydiscr(tbeg_sost:tend_sost));
ndiscr=length(dydiscr)+1;
ndiscrsort=length(dydiscrsort)+1;
dygroup=floor(ndiscr/numsost); % 20080605 round zamenen na floor (okrugl do menshego)
if (ver1==0) % Незадейственно с интерфейса (радиобокс 5 должен бить)
    sostinterv=[];
    sredn=[];
    [ibeg,iend]=getfrequentmember(dydiscrsort);
    remain=ndiscr-(iend-ibeg);
    sostlen=remain/(numsost-1);
    if (iend-ibeg>dygroup/2)
        if(ibeg<ndiscr-iend)% Первый интервал - меньший
            n1=round((ibeg-1)/sostlen);
            if (n1>0)
                [sostinterv1,sredn1]=razbitie(dydiscrsort,1,ibeg,n1);
                remain=remain-(ibeg-1);
                sostlen=remain/(numsost-1-n1);
                n2=round((ndiscr-iend)/sostlen);
                [sostinterv2,sredn2]=razbitie(dydiscrsort,iend,ndiscrsort,n2);
                sostinterv=[sostinterv1;dydiscrsort(iend);sostinterv2];
                sredn=[sredn1,dydiscrsort(ibeg),sredn2];
            end
        else
            n2=round((ndiscr-iend)/sostlen);
            [sostinterv2,sredn2]=razbitie(dydiscrsort,iend,ndiscrsort,n2);
            remain=remain-(ndiscr-iend);
            if (numsost~=1+n2)
                sostlen=remain/(numsost-1-n2);
                n1=round((ibeg-1)/sostlen);
                [sostinterv1,sredn1]=razbitie(dydiscrsort,1,ibeg,n1);
                sostinterv=[sostinterv1;dydiscrsort(iend);sostinterv2];
                sredn=[sredn1,dydiscrsort(ibeg),sredn2];
            else
            end
        end
    else
        for i=1:numsost
            if (i*dygroup<=length(dydiscrsort))
                sostinterv=[sostinterv;dydiscrsort(i*dygroup)];
            end
            kray=i*dygroup;
            if (kray>length(dydiscrsort))
                kray=length(dydiscrsort);
            end
            sredn=[sredn,sum(dydiscrsort((i-1)*dygroup+1:kray))/dygroup];
        end
    end
else
    if (ver1==2) %Попытка сгенерировать равномерное распределение состояний. (радиобокс номер1)
        raspr=raspred_veroyatn(dydiscrsort,length(dydiscrsort));%(1,i) - значения, (2,i) - частоты
        lenraspr=size(raspr,2);%???
        izero=find_zero(raspr);
        avg_col=sum(raspr(2,:))/numsost; % среднее кол-во значений.
        if (mod(numsost,2)==1) %нечетное кол-во состояний - значит выделяем среднее состояние.
            leftborder=find_border(raspr,1,izero,avg_col);
            rightborder=find_border(raspr,lenraspr,izero,avg_col);
            lastborder=leftborder;
            masborder=raspr(1,leftborder);
            sosts=(numsost-1)/2;
            for ii=1:floor((numsost-2)/2)
                avg_col=sum(raspr(2,1:lastborder))/sosts;
                border=[find_border(raspr,lastborder,1,avg_col)];
                masborder=[raspr(1,border);masborder];
                lastborder=border;
                sosts=sosts-1;
            end
            srednmin=sum(raspr(1,1:lastborder))/lastborder;
            lastborder=rightborder;
            masborder=[masborder;raspr(1,rightborder)];
            sosts=(numsost-1)/2;
            avg_col=sum(raspr(2,rightborder:lenraspr))/sosts;
            for ii=1:floor((numsost-2)/2)
                border=[find_border(raspr,lastborder,lenraspr,avg_col)];
                masborder=[masborder;raspr(1,border)];
                lastborder=border;
            end
            srednmax=sum(raspr(1,lastborder:lenraspr))/(lenraspr-lastborder);
        else %Четное кол-во состояний - ноль стает границей состояний.
            leftborder=izero;
            sosts=numsost/2;
            lastborder=leftborder;
            masborder=raspr(1,leftborder);
            for ii=1:floor((numsost-1)/2)
                avg_col=sum(raspr(2,1:lastborder))/sosts;% Кол-во состояний, на которые нужно разбить кусок
                border=find_border(raspr,lastborder,1,avg_col);
                masborder=[raspr(1,border);masborder];
                lastborder=border;
                sosts=sosts-1;
            end
            srednmin=sum(raspr(1,1:lastborder))/lastborder;
            rightborder=izero;
            lastborder=rightborder;
            sosts=(numsost)/2;
            avg_col=sum(raspr(2,rightborder:lenraspr))/sosts;% Кол-во состояний, на которые нужно разбить кусок
            for ii=1:floor((numsost-1)/2)
                border=find_border(raspr,lastborder,lenraspr,avg_col);
                masborder=[masborder;raspr(1,border)];
                lastborder=border;
                sosts=sosts-1;
            end
            srednmax=sum(raspr(1,lastborder:lenraspr))/(lenraspr-lastborder);
        end
        %sostinterv=sort(masborder); %Почему-то не сортировано. ОШИБКИ.
        sostinterv=masborder; % Оказывается есть одинаковые элементы
        %подсчет средних значений в интервалах. - просто средние значения
        %между границами интервалов. 
        if (length(sostinterv)<numsost-1)
            2222
        end
        sredn=sostinterv(1);%srednmin;%(min(dydiscr)+sostinterv(1))/2;
        for i=1:numsost-2
            sredn=[sredn,(sostinterv(i)+sostinterv(i+1))/2];
        end
        sredn=[sredn,sostinterv(numsost-1)];%srednmax];%(sostinterv(numsost-1)+max(dydiscr))/2];
    else
        if (ver1==1) %Равномерное по х (по отклонению) (радиобокс номер2)
            disp=sum(dydiscrsort.^2)/(ndiscrsort-1);%dispersiya
            sigma=sqrt(disp);
            global ksigma;
            maxdy=ksigma*sigma;%dydiscrsort(ndiscr-1);
            %maxdy=dydiscrsort(ndiscr-1);
            mindy=-ksigma*sigma;%dydiscrsort(1);
            %mindy=dydiscrsort(1);
            sdydiscr=(maxdy-mindy)/numsost;
            sostinterv=mindy+sdydiscr:sdydiscr:maxdy;
            sredn=mindy+sdydiscr/2:sdydiscr:maxdy;
        else
            if (ver1==4) % Новый вариант. (радиобокс номер 3)
                % Выделение S1 части в средине равномерно, а хвосты - отдельные 2 состояния.
                global chast_hwosta;
                s0=chast_hwosta; % процент значений, примерно выделяемых в средине.
                slefttail=s0/2; % процент на левый и правый хвост.
                nlefttail=round(slefttail*length(dydiscrsort));
                left=dydiscrsort(nlefttail);
                right=dydiscrsort(length(dydiscrsort)-nlefttail);
                sostinterv=[];
                if (numsost==2)
                    numsost=3;
                end
                step=(right-left)/(numsost-2);
                for i=left:step:right
                    sostinterv=[sostinterv;i];
                end
            else
                if (ver1==5) %Равномерный часть хвоста (радиобокс номер 4 в интерфейсе)
                    s0=0.7; % процент значений, примерно выделяемых в средине.
                    slefttail=1/numsost; % процент на левый и правый хвост.
                    nlefttail=round(slefttail*length(dydiscrsort));
                    left=dydiscrsort(nlefttail);
                    right=dydiscrsort(length(dydiscrsort)-nlefttail);
                    sostinterv=[];
                    if (numsost==2)
                        numsost=3;
                    end
                    step=(right-left)/(numsost-2);
                    for i=left:step:right
                        sostinterv=[sostinterv;i];
                    end 
                end
            end
        end
    end
end
% блок перевода приращений в номера события и заполнения матриц
% вероятностей переходов.
%sostinterv
sost=[];
summ_allotklon=0;
summ_otkl_group=zeros(1,numsost);
num_group=zeros(1,numsost);
matrix_kol=sparse(numsost^r,numsost);
if isempty(sostinterv)
    sostinterv=dydiscr(1);
end
while (numsost-1>length(sostinterv))
    sostinterv=[sostinterv(1)-0.000001;sostinterv];
end
summ_dy=zeros(1,numsost);
for i=1:ndiscr-1
    newsost=numsost; %predpolagaem, shto esli bolshe wseh ghanic, znachit poslednee sostoyanie 
    for jj=1:numsost-1
        %i
        %size (dydiscr)
        %jj
        %dygroup
        %numsost
        %size(dydiscrsort)
        if (dydiscr(i)<sostinterv(jj))
            newsost=jj;
            break;
        end
    end
    %absotklon=(dydiscr(i)-sredn(jj))^2;
    %summ_allotklon=summ_allotklon+absotklon;
    %summ_otkl_group(newsost)=summ_otkl_group(newsost)+absotklon;
    if (i>tbeg_sost)&&(i<tend_sost)
        summ_dy(newsost)=summ_dy(newsost)+dydiscr(i);
        num_group(newsost)=num_group(newsost)+1;
    end
    %dydiscr(i)
    %dydiscrsort(jj*dygroup)
    sost=[sost,newsost];% sost - 1,2,...,numsost
    if (i-r*dx>1)
        %proshlsost=sost(i-r-1:i-1);
        nsost_proshl=0;ppp=1;
        for j=i-r*dx:dx:i-1
            nsost_proshl=nsost_proshl+ppp*(sost(j)-1);
            ppp=ppp*numsost;
        end
        nsost_sl=sost(i);
        sost(i-r:i);%otladka
        matrix_kol(nsost_proshl+1,nsost_sl)=matrix_kol(nsost_proshl+1,nsost_sl)+1;
    end
end
if (min(num_group)>1)
    stdotklon_group=summ_otkl_group./num_group;
    stdotklon_all=0;%absotklon/sum(num_group);
else
    stdotklon_group=0;
    stdotklon_all=0;
end
%Принудительный пересчет средних значений
sredn=[];
for iii=1:numsost
    if (num_group(iii)>0)
        sredn=[sredn,summ_dy(iii)/num_group(iii)];
    else
        sredn=[sredn,sostinterv(iii)];
    end
end


global graphs_raspr;
if (~isempty(graphs_raspr))
    raspr=raspred_veroyatn(dydiscr,numsost*10);%(1,i) - значения, (2,i) - частоты
    figure;
    plot(raspr(1,:),raspr(2,:));
    figraspr=gca;
    sostinterv;
    numsost;
    perest=0;
    for ii=1:length(sostinterv)-2
        if sostinterv(ii)==sostinterv(ii+1)
            sostinterv(ii+1)=sostinterv(ii+1)+0.01*(sostinterv(ii+2)-sostinterv(ii+1))+0.0000001;
            perest=1;
        end
    end
    if (perest==0)
        set(figraspr,'XTick',sostinterv(1:numsost-1));%-1)); Исправления чтобы выводить все границы
    end
    set(figraspr,'XGrid','On');
end
statstruct=[];
statstruct.dx=dx;
statstruct.r=r;
statstruct.matrix_kol=matrix_kol;
global masstat;
masstat=[masstat;statstruct];

ysost=sost;    

function [ibegbest,iendbest]=getfrequentmember(dydiscrsort);
% Возвращает интервалы наиболее часто встречаемого элемента в массиве с
% целью сделать его отдельным состоянием. Массив должен быть отсортирован.
% Возвращает индекс начала и конца последовательности из наиболее часто
% повторяемого элемента.
ibeg=1;iend=1;
ibegbest=1;iendbest=1;
len=0;
for i=1:length(dydiscrsort)-1;
    if (dydiscrsort(i)==dydiscrsort(i+1))
        iend=i+1;
    else
        
        if (iend-ibeg>len)% найден ряд одинаковых чисел большей длины
            ibegbest=ibeg;
            iendbest=iend;
            len=iend-ibeg;
        end
        ibeg=i+1;
        iend=i+1;    
    end
end
        
function [sostinterv,sredn]=razbitie(dydiscrsort,ibeg,iend,numsost);
% Разбивает указанный интервал значений на указанное количество
% подинтервалов (с округлением) и возвращает границы и средние на
% интервалах (часть не тестировалась, в связи с редкостью такой ситуации)
sostinterv=[];
sredn=[];
if (numsost>1)
    step=floor((iend-ibeg)/numsost);
    if (iend>length(dydiscrsort))
        iend=length(dydiscrsort);
    end
    for i=ibeg+step:step:iend 
        if (i<=length(dydiscrsort))
            sostinterv=[sostinterv;dydiscrsort(i)];
        end
        kray=i;
        if (kray>iend)
            kray=iend;
        end
        if (step~=0)
            sredn=[sredn,sum(dydiscrsort(i-step+1:kray))/step];
        else
            sredn=sum(dydiscrsort(ibeg:iend))/(iend-ibeg);
        end
    end
    if (isempty(sredn))
        sredn=sum(dydiscrsort(ibeg:iend))/(iend-ibeg);
    end
end

function izero=find_zero(raspr);
% Находит номер группы, которая наиболее близка к нулю.(1,i) - значения,
% (2,i) - частоты
n=length(raspr);
lenmax=abs(raspr(1,1));
izero=1;
for i=1:n
    if (abs(raspr(1,i))<lenmax)
        lenmax=abs(raspr(1,i));
        izero=i;
    end
end


function border=find_border(raspr,ibeg,iend,avg_col);
% Находит ответную границу состояния, чтобы кол-во элементов было как можно
% ближе к указанному значению avg_col.
% raspr - массив распределений (2хн первая строка кол-во 2 среднее значение)
%,ibeg,iend, - начальная и конечная точка испытаний.
if (iend>ibeg)
    step=1;
else
    step=-1;
end
summ=0; % Сумма распределения
border=[]; %Если граница не найдется до конца указанного участка - значит ее нету.
for i=ibeg:step:iend
    summ=summ+raspr(2,i);
    if (summ>avg_col) % если нужное кол-во достигнуто - і - єто граница
        border=i;
        break;
    end
end
