Звучит так, как будто вы хотите использовать ячейки, которые различаются по размеру в зависимости от плотности значений x. Я думаю, что вы все еще можете использовать функцию HISTC, как в ответе на ваш предыдущий пост, но вам просто нужно дать ему другой набор ребер.
Я не знаю, действительно ли вы этого хотите, но вот одно предложение: вместо того, чтобы разбивать ось х на 70 одинаково разнесенных групп, разбейте отсортированные данные х на 70 равных групп и определите значения ребер. Я думаю, что этот код должен работать:
% Start by assuming x and y are vectors of data:
nBins = 70;
nValues = length(x);
[xsort,index] = sort(x); % Sort x in ascending order
ysort = y(index); % Sort y the same way as x
binEdges = [xsort(1:ceil(nValues/nBins):nValues) xsort(nValues)+1];
% Bin the data and get the averages as in previous post (using ysort instead of y):
[h,whichBin] = histc(xsort,binEdges);
for i = 1:nBins
flagBinMembers = (whichBin == i);
binMembers = ysort(flagBinMembers);
binMean(i) = mean(binMembers);
end
Это должно дать вам лотки, которые различаются по размеру в зависимости от плотности данных.
ОБНОВЛЕНИЕ: Другая версия ...
Вот еще одна идея, которая пришла мне в голову после нескольких комментариев. С помощью этого кода вы устанавливаете порог (maxDelta) для разницы между соседними точками данных в x. Любые значения x, которые отличаются от их большего соседа на величину, большую или равную maxDelta, вынуждены находиться в их собственной корзине (все они одиноки). Вы по-прежнему выбираете значение для nBins, но конечное число бинов будет больше, чем это значение, когда точки разброса отведены к их собственным бинам.
% Start by assuming x and y are vectors of data:
maxDelta = 10; % Or whatever suits your data set!
nBins = 70;
nValues = length(x);
[xsort,index] = sort(x); % Sort x in ascending order
ysort = y(index); % Sort y the same way as x
% Create bin edges:
edgeIndex = false(1,nValues);
edgeIndex(1:ceil(nValues/nBins):nValues) = true;
edgeIndex = edgeIndex | ([0 diff(xsort)] >= maxDelta);
nBins = sum(edgeIndex);
binEdges = [xsort(edgeIndex) xsort(nValues)+1];
% Bin the data and get the y averages:
[h,whichBin] = histc(xsort,binEdges);
for i = 1:nBins
flagBinMembers = (whichBin == i);
binMembers = ysort(flagBinMembers);
binMean(i) = mean(binMembers);
end
Я проверил это на нескольких небольших выборочных наборах данных, и, похоже, он делает то, что должен. Надеюсь, это будет работать и для вашего набора данных, что бы он ни содержал! =)