Замена нежелательных экземпляров тсс и 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)