Main Content

권장되지 않는 hist 및 histc 인스턴스의 대체 방법

이전 히스토그램 함수(hist, histc)

이전 버전의 MATLAB®에서는 기본적으로 hist 함수나 histc 함수를 사용하여 히스토그램을 생성하고 히스토그램 Bin 도수를 계산합니다. 이러한 함수는 일부 일반적인 용도로는 적합하지만 전반적으로 기능에 제한이 있습니다. 새 코드에서 histhistc를 사용하는 것은 특히 다음과 같은 이유로 권장되지 않습니다.

  • hist를 사용하여 히스토그램을 만든 후에는 히스토그램의 속성을 수정하기가 어려우며, 수정하려면 전체 히스토그램을 다시 계산해야 합니다.

  • hist의 디폴트 동작은 10개의 Bin을 사용하는 것이며, 이는 많은 데이터 세트에 적합하지 않습니다.

  • 정규화된 히스토그램을 플로팅하려면 수동으로 계산해야 합니다.

  • histhistc의 동작이 일관되지 않습니다.

권장되는 히스토그램 함수

histogram, histcounts, discretize 함수는 MATLAB에서 히스토그램을 생성하고 계산하는 기능을 크게 향상시키는 동시에 일관성과 사용 편의성도 높습니다. histogram, histcounts, discretize는 히스토그램 생성 및 계산을 위한 함수로, 새 코드에 권장됩니다.

특히 주목할 만한 것은 다음과 같은 변경 내용으로, 이는 histhistc에 대한 개선 사항입니다.

  • histogram은 histogram 객체를 반환할 수 있습니다. 이 객체를 사용하여 히스토그램의 속성을 수정할 수 있습니다.

  • histogramhistcounts에는 모두 자동 비닝(Binning) 및 정규화 기능이 있으며, 두 함수는 공통적인 여러 내장 옵션을 갖고 있습니다.

  • histcountshistogram에 대한 주 계산 함수입니다. 따라서 이 두 함수는 일관되게 동작합니다.

  • discretize는 각 요소의 Bin 배치를 결정할 수 있는 추가적인 옵션과 유연성을 제공합니다.

코드 업데이트가 필요한 차이점

앞에서 언급한 개선 사항에도 불구하고, 이전 함수와 권장되는 새 함수 간에는 여러 가지 중요한 차이점이 있으며, 이로 인해 코드를 업데이트해야 할 수도 있습니다. 다음 표에는 함수 간의 차이점이 요약되어 있으며 코드 업데이트를 위한 제안 사항도 나와 있습니다.

hist의 코드 업데이트

차이점이전 hist의 동작새로운 histogram의 동작

입력 행렬

hist는 입력 행렬의 각 열에 대한 히스토그램을 생성하고 동일한 Figure에 히스토그램을 나란히 플로팅합니다.

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

histogram은 입력 행렬을 tall형 벡터로 처리하고 단일 히스토그램을 생성합니다. 여러 히스토그램을 플로팅하려면 데이터의 각 열마다 다른 histogram 객체를 생성하십시오. hold on 명령을 사용하여 동일한 Figure에 여러 히스토그램을 플로팅할 수 있습니다.

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

위의 코드 예제에서는 각 히스토그램에 동일한 Bin 경계값을 사용하지만, 경우에 따라서는 이 대신 각 히스토그램의 BinWidth를 동일하게 설정하는 것이 더 좋을 수도 있습니다. 또한 화면 표시를 위해, 각 히스토그램의 FaceAlpha 속성을 설정하는 것이 도움이 될 수도 있습니다. 이는 겹치는 막대의 투명도에 영향을 줍니다.

Bin 지정

hist는 두 번째 입력값으로 Bin 중심값을 받을 수 있습니다.

histogram은 두 번째 입력값으로 Bin 경계값을 받을 수 있습니다.

histogram에서 사용할 수 있도록 Bin 중심값을 Bin 경계값으로 변환하려면 Bin 중심값을 Bin 경계값으로 변환 항목을 참조하십시오.

참고

hist에서 사용하는 Bin 중심값이 정수인 경우(예: hist(A,-3:3))에는, histogram의 새로운 정수용 내장 비닝 방법을 사용하십시오.

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

출력 인수

hist는 Bin 도수를 출력 인수로 반환하며, 선택적으로 Bin 중심값을 두 번째 출력 인수로 반환할 수 있습니다.

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

histogram은 histogram 객체를 출력 인수로 반환합니다. 이 객체에는 Bin 도수, Bin 경계값 등과 같이 여러 필요한 속성이 포함되어 있습니다. 해당하는 속성값을 변경하여 histogram의 여러 특성을 수정할 수 있습니다. 자세한 내용은 histogram 항목을 참조하십시오.

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

참고

히스토그램을 플로팅하지 않고 Bin 도수를 계산하려면 [N, Centers] = hist(A)[N,edges] = histcounts(A,nbins)로 바꾸십시오.

Bin의 디폴트 개수

hist는 기본적으로 10개의 Bin을 사용합니다.

histogramhistcounts는 모두 기본적으로 자동 비닝(Binning) 알고리즘을 사용합니다. Bin 개수는 입력 데이터의 크기와 범위에 의해 결정됩니다.

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

Bin 제한

hist는 최소 유한 데이터값 및 최대 유한 데이터값을 사용하여 플롯의 첫 번째 막대와 마지막 막대의 왼쪽 경계값과 오른쪽 경계값을 결정합니다. -InfInf는 첫 번째 Bin과 마지막 Bin에 각각 포함됩니다.

BinLimits가 설정되지 않은 경우, histogram은 최소 유한 데이터 값과 최대 유한 데이터 값을 기준으로 하지만 이와 정확히 동일하지는 않은 유리수 Bin 제한을 사용합니다. Bin 경계값 중 하나가 Inf 또는 -Inf를 Bin 경계값으로 명시적으로 지정한 경우가 아니면, histogramInf 값을 무시합니다.

유한 데이터 값(Inf 값 아님)에 대한 hist(A)의 결과를 재현하려면 10개의 Bin을 사용하고 BinLimits를 최소 데이터 값 및 최대 데이터 값으로 명시적으로 지정하십시오.

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

histc의 코드 업데이트

차이점이전 histc의 동작새로운 histcounts의 동작
입력 행렬

histc는 입력 데이터의 각 열에 대한 Bin 도수를 계산합니다. 크기가 m×n인 입력 행렬에 대해 histc는 크기가 length(edges)×n인, Bin 도수 행렬을 반환합니다.

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

histcounts는 입력 행렬을 tall형 벡터로 처리하고 전체 행렬에 대한 Bin 도수를 계산합니다.

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

각 열에 대해 Bin 도수를 계산하려면 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

행렬의 열 개수가 많아 성능이 문제가 된다면, 각 열에 대한 Bin 도수 계산 시에 계속해서 histc를 사용하는 것을 고려해 보십시오.

마지막 Bin에 포함된 값

A(i) == edges(end)인 경우 histc는 마지막 Bin에 요소 A(i)를 포함시킵니다. 출력값 Nlength(edges)개의 요소를 갖는 Bin 도수로 이루어진 벡터입니다. Bin 범위를 벗어난 값은 계산되지 않습니다.

edges(end-1) <= A(i) <= edges(end)인 경우 histcounts는 마지막 Bin에 요소 A(i)를 포함시킵니다. 즉, histcountshistc의 마지막 두 개 Bin을 하나의 최종 Bin으로 결합합니다. 출력값 Nlength(edges)-1개의 요소를 갖는 Bin 도수로 이루어진 벡터입니다. Bin 경계값을 지정하면 Bin 범위를 벗어난 값이 계산되지 않습니다. Bin 경계값을 지정하지 않을 경우 histcounts는 모든 데이터를 포함시키는 데 사용할 적절한 Bin 경계값을 자동으로 결정합니다.

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

histc의 마지막 Bin은 주로 정수를 계산하는 데 유용합니다. histcounts를 사용하여 정수 계산을 수행하려면, 'integers' Bin 방법을 사용하십시오.

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)와 같은 Bin 도수 계산에는 histcounts를 사용합니다. histcounts 함수는 Bin 도수를 출력 인수로 반환하며, 선택적으로 Bin 경계값을 두 번째 출력 인수로 반환하거나 Bin 인덱스를 세 번째 출력 인수로 반환할 수 있습니다.

    A = randn(15,1);
    [N,Edges,Bin] = histcounts(A)
  • [~,Bin] = histc(A,edges)와 같은 Bin 배치 계산에는 discretize를 사용합니다. discretize 함수는 각 요소의 Bin 배치를 결정할 수 있는 추가 옵션을 제공합니다.

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

Bin 중심값을 Bin 경계값으로 변환

hist 함수는 Bin 중심값을 받는 반면, histogram 함수는 Bin 경계값을 받습니다. histogram을 사용하도록 코드를 업데이트하려면 Bin 중심값을 Bin 경계값으로 변환하여 hist에서 얻은 결과를 재현해야 할 수 있습니다.

예를 들어, hist에서 사용할 Bin 중심값을 지정합니다. 이러한 Bin은 너비가 균일합니다.

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 object. The axes object contains an object of type patch. This object represents A.

Bin 중심값을 Bin 경계값으로 변환하기 위해서는 centers에서 연속 값 사이의 중간점을 계산해야 합니다. 이 방법은 균일하거나 균일하지 않은 Bin 너비 모두에 대해 hist의 결과를 재현할 수 있습니다.

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

hist 함수는 각 Bin의 오른쪽 경계값을 포함합니다(첫 번째 Bin은 양쪽 경계값을 모두 포함함). 반면 histogram은 각 Bin의 왼쪽 경계값을 포함합니다(마지막 Bin은 양쪽 경계값을 모두 포함함). Bin 경계값을 약간 이동시키면 hist와 동일한 Bin 도수를 얻을 수 있습니다.

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

  -10.0000   -5.0000    0.0000    5.0000   10.0000

이제 histogram에 Bin 경계값을 사용합니다.

histogram(A,edges)

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