Как перевернуть определение ребер (1) и ребер (конец) для функции histc в MATLAB? - PullRequest
1 голос
/ 13 октября 2009

В MATLAB:

n = histc(x,edges);

определяется следующим образом:

n (k) считает значение x (i), если ребра (k) <= x (i) <ребра (k + 1). Последняя корзина считает любые значения х, которые соответствуют края (конец). </p>

Есть ли способ перевернуть поведение конца так, чтобы n (1) считало любые значения x, которые соответствуют ребрам (1), а n (end) подсчитывает значения x (i), которые удовлетворяют ребрам (end-1) <= x (i) <ребра (конец)? </p>

Ответы [ 2 ]

2 голосов
/ 13 октября 2009

Рассмотрим следующий код:

n = histc(x, [edges(1) edges]);
n(1) = sum(x==edges(1));
n(end) = [];

В соответствии с опубликованным вопросом, вернется выше:

  • n (1): подсчитывает любые значения x, которые соответствуют edges(1)
  • n (k) [k ~ = 1]: считает значение x (i), если edges(k-1) <= x(i) < edges(k)

Это отличается от решения gnovice тем, что в его ответе используются границы: edges(k-1) < x(i) <= edges(k) (обратите внимание на положение знака равенства).


Чтобы продемонстрировать, рассмотрим этот простой пример:

x = [0 1 1.5 2 2.5 4 6.5 8 10];
edges = 0:2:10;

>> n = fliplr(histc(-x,-fliplr(edges)))
n =
     1     3     2     0     2     1

соответствует интервалам: 0 (0,2] (2,4] (4,6] (6,8] (8,10]

Против:

>> n = histc(x, [edges(1) edges]);
>> n(1) = sum(x==edges(1));
>> n(end) = []
n =
     1     3     2     1     1     1

соответствует интервалам: 0 [0,2) [2,4) [4,6) [6,8) [8,10)

0 голосов
/ 13 октября 2009

Поскольку аргумент edges должен иметь монотонно неубывающие значения, один из способов переворота поведения ребра - это отменить и перевернуть аргумент edges и отменить значения для биннинга. Если затем перевернуть вывод счетчика из HISTC , вы должны увидеть типичное поведение ребра HISTC в обратном порядке:

n = fliplr(histc(-x,-fliplr(edges)));

В приведенном выше примере используется FLIPLR , поэтому x и edges должны быть векторами строк (т.е. 1-на-N). Этот код будет хранить данные в соответствии со следующими критериями:

  • Первый бин n(1) считает любые значения x, которые соответствуют edges(1).
  • Другие ячейки n(k) считают значения x(i) такими, что edges(k-1) < x(i) <= edges(k).

Обратите внимание, что это переворачивает поведение ребер всех корзин, а не только первых и последних корзин! Типичное поведение HISTC для корзины n(k) использует уравнение edges(k) <= x(i) < edges(k+1) (обратите внимание на разницу между индексами и тем, какая сторона имеет знак равенства!).


РЕДАКТИРОВАТЬ: После некоторого обсуждения ...

Если вы вместо хотели бы поместить данные в соответствии со следующими критериями:

  • Первый бин n(1) считает любые значения x, которые соответствуют edges(1).
  • Второй блок n(2) считает значения x(i), такие что edges(1) < x(i) < edges(2).
  • Другие ячейки n(k) считают значения x(i) такими, что edges(k-1) <= x(i) < edges(k).

Тогда следующее должно выполнить это:

n = histc(x,[edges(1) edges(1)+eps(edges(1)) edges(2:end)]);
n(end) = [];

Первый лоток должен захватывать только значения, равные edges(1), а нижний край второго лотка должен начинаться с инкрементного значения выше edges(1) (обнаруживается с использованием функции EPS ). Последний бин, который считает число значений, равное edges(end), выбрасывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...