exponenta event banner

Заменить обескураженные экземпляры 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), использовать новый встроенный метод binning histogram для целых чисел.

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

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

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

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около-n, histc возвращает матрицу счетчиков bin размера length(edges)около-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 возвращает счетчики bin в качестве выходного аргумента и при необходимости может возвращать индексы bin в качестве второго выходного аргумента.

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)

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)];

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.