function [res,stepScale]=buildPDensity(arg,steps)
% [res,stepScale]=buildPDensity(arg,steps)
% Строит распределение встречающихся в квадратной матрице элементов
% Аргументы  : arg - матрица, распределение элементов которой строится
%              steps - количество шагов, на которые разбивается диапазон
%                значений элементов матрицы Arg (по умолчанию 50)
% Результаты : res - полученный вектор
%              stepScale - вектор отрезков, по которым происходило разбиение

[m,n]=size(arg);             % определяем размер исходной матрицы
if nargin==1                 % если не задан второй параметр - берем 50
    steps=50;
end
if n-m==2
    arg=arg(:,3:n);
elseif n-m==1
    arg=arg(:,2:n);
end
[m,n]=size(arg);             % определяем размер исходной матрицы
if (m~=1) && (n~=1)
    arg=arg-diag(diag(arg));
end
% находим наименьшее и наибольшее значения в исходной матрице
argMin=min(min(arg));
% вычисляем шаг 
step=(max(max(arg))-argMin)/steps;
array(1,1:steps)=0;
for i=1:m
    for j=1:n
        if i~=j
            index=floor((arg(i,j)-argMin)/step)+1;
            if index>steps
                index=steps;
            end
            array(1,index)=array(1,index)+1;
        end
    end
end
res=array./(m*n)/step;
stepScale(1,1:steps)=0;
for i=1:steps
    stepScale(1,i)=argMin+i*step;
    if res(1,i)==0
        res(1,i)=NaN;
    end
end
% Приводимо до нормального вигляду (20040706)
[m,n]=size(stepScale);
index=1;
while index<=n
    if (isnan(res(1,index)))
        index2=index+1;
        while (index2<=n) && (isnan(res(1,index2)))
            index2=index2+1;
        end
        if (index2-index>1)
            if (index2>n)
                stepScale=stepScale(1,1:index);
                res=res(1,1:index);
            else
                stepScale=[stepScale(1,1:index) stepScale(1,index2:n)];
                res=[res(1,1:index) res(1,index2:n)];
            end
            [m,n]=size(stepScale);        
        end
    end
    index=index+1;
end       
% Міняємо NaN на 0 з відповідним перерахуванням ряду
[m,n]=size(stepScale);
if (isnan(res(1,1)))
    stepScale(1,1)=stepScale(1,2);
    res(1,1)=0;
else
    stepScale=[stepScale(1,1) stepScale];
    res=[0 res];
end
[m,n]=size(stepScale);
if (isnan(res(1,n)))
    stepScale(1,n)=stepScale(1,n-1);
    res(1,n)=0;
else
    stepScale=[stepScale stepScale(1,n)];
    res=[res 0];
end
[m,n]=size(stepScale);
index=2;
while (index<n)
    if (isnan(res(1,index)))
        stepScale=[stepScale(1,1:index-1) stepScale(1,index-1) stepScale(1,index+1) stepScale(1,index+1:n)];
        res=[res(1,1:index-1) 0 0 res(1,index+1:n)];
        [m,n]=size(stepScale);
    end
    index=index+1;
end