Замена нежелательных экземпляров тсс и histc

Старые Функции Гистограммы (тсс, histc)

Более ранние версии MATLAB® используют hist и функции histc как первичный способ создать гистограммы и вычислить количества интервала гистограммы. Эти функции, в то время как хороший для некоторых общих целей, ограничили полные возможности. Использованию hist и histc в новом коде препятствуют по этим причинам (среди других):

  • После использования hist, чтобы создать гистограмму, изменение свойств гистограммы является трудным и требует перевычисления целой гистограммы.

  • Поведение по умолчанию hist должно использовать 10 интервалов, который не подходит для многих наборов данных.

  • Графическое изображение нормализованной гистограммы требует ручных вычислений.

  • hist и histc не имеют сопоставимого поведения.

Рекомендуемые функции гистограммы

histogram, histcounts и функции discretize существенно совершенствуют возможности создания гистограммы и вычисления в MATLAB при тихом продвижении непротиворечивости и простоты использования. histogram, histcounts и discretize являются рекомендуемыми функциями создания и вычисления гистограммы для нового кода.

Особо значимый следующие изменения, которые стоят как улучшения по сравнению с hist и histc:

  • histogram может возвратить объект гистограммы. Можно использовать объект изменить свойства гистограммы.

  • И histogram и histcounts имеют автоматическое раскладывание и возможности нормализации с несколькими общими встроенными опциями.

  • histcounts является первичной функцией вычисления для histogram. Результат состоит в том, что функции имеют сопоставимое поведение.

  • discretize предоставляет дополнительные возможности и гибкость для определения размещения интервала каждого элемента.

Различия, требующие обновлений кода

Несмотря на вышеупомянутые улучшения, существует несколько важных различий между старым и теперь рекомендуемыми функциями, которые могут потребовать обновления вашего кода. Таблицы суммируют различия между функциями и обеспечивают предложения для обновления кода.

Обновления кода для hist

РазличиеСтарое поведение с histНовое поведение с histogram

Введите матрицы

hist создает гистограмму для каждого столбца входной матрицы и строит график гистограмм бок о бок в той же фигуре.

A = randn(100,2);
hist(A)

histogram обрабатывает входную матрицу как единственный высокий вектор и создает единственную гистограмму. Чтобы построить график нескольких гистограмм, создайте различный объект гистограммы для каждого столбца данных. Используйте команду hold on, чтобы построить график гистограмм в той же фигуре.

A = randn(100,2);
h1 = histogram(A(:,1),10)
edges = h1.BinEdges;
hold on
h2 = histogram(A(:,2),edges)

Вышеупомянутый пример кода использует те же края интервала для каждой гистограммы, но в некоторых случаях лучше установить BinWidth каждой гистограммы быть тем же самым вместо этого. Кроме того, в целях отображения может быть полезно установить свойство FaceAlpha каждой гистограммы, когда это влияет на прозрачность перекрывающихся панелей.

Спецификация интервала

hist принимает центры интервала как второй входной параметр.

histogram принимает края интервала как второй входной параметр.

Чтобы преобразовать центры интервала в края интервала для использования с histogram, смотрите, Преобразовывают Центры Интервала в Края Интервала.

Примечание

В случаях, где центры интервала, используемые с hist, являются целыми числами, такими как hist(A,-3:3), используют новый встроенный метод раскладывания histogram для целых чисел.

histogram(A,'BinLimits',[-3,3],'BinMethod','integers')

Выходные аргументы

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

A = randn(100,1);
[N, Centers] = hist(A)

histogram возвращает объект гистограммы как выходной аргумент. Объект содержит много свойств интереса (количества интервала, края интервала, и так далее). Можно изменить аспекты гистограммы путем изменения ее значений свойств. Для получения дополнительной информации смотрите histogram.

A = randn(100,1);
h = histogram(A);
N = h.Values
Edges = h.BinEdges

Примечание

Чтобы вычислить количества интервала (не строя график гистограммы), замените [N, Centers] = hist(A) на [N,edges] = histcounts(A,nbins).

Количество по умолчанию интервалов

hist использует 10 интервалов по умолчанию.

И histogram и histcounts используют автоматический алгоритм раскладывания по умолчанию. Количество интервалов определяется размером и распространением входных данных.

A = randn(100,1);
histogram(A)
histcounts(A)

'BinLimits'

hist использует минимальные и максимальные значения конечных данных, чтобы определить левые и правые края первой и последней панели в графике. -Inf и Inf включены в первый и последний интервал, соответственно.

Если BinLimits не установлен, то histogram использует рациональные пределы интервала на основе, но не точно равный, минимальные и максимальные значения конечных данных. histogram игнорирует значения Inf, если один из краев интервала явным образом не задает Inf или -Inf как край интервала.

Чтобы воспроизвести результаты hist(A) для конечных данных (никакие значения Inf), используйте 10 интервалов и явным образом установите BinLimits на минимальные и максимальные значения данных.

A = randi(5,100,1);
histogram(A,10,'BinLimits',[min(A) max(A)])

Обновления кода для histc

РазличиеСтарое поведение с histcНовое поведение с histcounts
Введите матрицы

histc вычисляет счета интервала для каждого столбца входных данных. Для входной матрицы размера m-by-n, histc возвращает матрицу количеств интервала размера length(edges)-by-n.

A = randn(100,10);
edges = -4:4;
N = histc(A,edges)

histcounts обрабатывает входную матрицу как единственный высокий вектор и вычисляет, интервал значит целую матрицу.

A = randn(100,10);
edges = -4:4;
N = histcounts(A,edges)

Используйте цикл for, чтобы вычислить количества интервала по каждому столбцу.

A = randn(100,10);
nbins = 10;
N = zeros(nbins, size(A,2));
for k = 1:size(A,2)
   N(:,k) = histcounts(A(:,k),nbins);
end

Если производительность является проблемой из-за большого количества столбцов в матрице, то рассмотрите продолжение использовать histc для постолбцовых количеств интервала.

Значения включены в последний интервал

histc включает элемент A(i) в последний интервал если A(i) == edges(end). Вывод, N, является вектором с элементами length(edges), содержащими количества интервала. Значения, выходящие за пределы интервалов, не считаются.

histcounts включает элемент A(i) в последний интервал если edges(end-1) <= A(i) <= edges(end). Другими словами, histcounts комбинирует последние два интервала от histc в единственный итоговый интервал. Вывод, N, является вектором с элементами length(edges)-1, содержащими количества интервала. Если вы задаете края интервала, то значения, выходящие за пределы интервалов, не считаются. В противном случае histcounts автоматически определяет соответствующие края интервала, чтобы использовать, чтобы включать все данные.

A = 1:4;
edges = [1 2 2.5 3]
N = histcounts(A)
N = histcounts(A,edges)

Последний интервал от histc, в основном, полезен, чтобы считать целые числа. Чтобы сделать это целое число, рассчитывающее с histcounts, используйте метод интервала 'integers':

N = histcounts(A,'BinMethod','integers'); 
Выходные аргументы

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

A = randn(15,1);
edges = -4:4;
[N,Bin] = histc(A,edges)
  • Для вычислений количества интервала как N = histc(A,edges) или [N,bin] = histc(A,edges), используйте histcounts. Функция histcounts возвращает количества интервала как выходной аргумент, и опционально может возвратить края интервала как второй вывод или индексы интервала как третий вывод.

    A = randn(15,1);
    [N,Edges,Bin] = histcounts(A)
  • Для вычислений размещения интервала как [~,Bin] = histc(A,edges) используйте discretize. Функция discretize предлагает дополнительные опции для определения размещения интервала каждого элемента.

    A = randn(15,1);
    edges = -4:4;
    Bin = discretize(A,edges)

Преобразование центров интервала в края интервала

Функция hist принимает центры интервала, тогда как функция histogram принимает края интервала. Чтобы обновить код, чтобы использовать histogram, вы можете должны быть преобразовать центры интервала в края интервала, чтобы воспроизвести результаты, достигнутые с hist.

Например, задайте центры интервала использования с hist. Эти интервалы имеют универсальную ширину.

A = [-9 -6 -5 -2 0 1 3 3 4 7];
centers = [-7.5 -2.5 2.5 7.5];
hist(A,centers)

Чтобы преобразовать центры интервала в края интервала, вычислите среднюю точку между последовательными значениями в centers. Этот метод воспроизводит результаты hist и для универсальных и для неоднородных ширин интервала.

d = diff(centers)/2;
edges = [centers(1)-d(1), centers(1:end-1)+d, centers(end)+d(end)];

Функция hist включает значения, падающие на правый край каждого интервала (первый интервал включает оба края), тогда как histogram включает значения, которые падают на левый край каждого интервала (и последний интервал включает оба края). Переключите края интервала немного, чтобы получить те же количества интервала как hist.

edges(2:end) = edges(2:end)+eps(edges(2:end))
edges = 1×5

  -10.0000   -5.0000    0.0000    5.0000   10.0000

Теперь, используйте histogram с краями интервала.

histogram(A,edges)

Была ли эта тема полезной?