Замените обескураженные образцы hist и histc

Старые функции гистограммы (hist, 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)

Пределы интервала

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 обрабатывает матрицу входа как одну tall вектора и вычисляет количество интервалов для всей матрицы.

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)

Преобразование центров интервалов в границы интервала

The 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)

Figure contains an axes. The axes contains an object of type patch. This object represents A.

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

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

The 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)

Figure contains an axes. The axes contains an object of type histogram.