권장되지 않는 hist 및 histc 인스턴스의 대체 방법
이전 히스토그램 함수(hist
, histc
)
이전 버전의 MATLAB®에서는 기본적으로 hist
함수나 histc
함수를 사용하여 히스토그램을 생성하고 히스토그램 Bin 도수를 계산합니다. 이러한 함수는 일부 일반적인 용도로는 적합하지만 전반적으로 기능에 제한이 있습니다. 새 코드에서 hist
나 histc
를 사용하는 것은 특히 다음과 같은 이유로 권장되지 않습니다.
hist
를 사용하여 히스토그램을 만든 후에는 히스토그램의 속성을 수정하기가 어려우며, 수정하려면 전체 히스토그램을 다시 계산해야 합니다.hist
의 디폴트 동작은 10개의 Bin을 사용하는 것이며, 이는 많은 데이터 세트에 적합하지 않습니다.정규화된 히스토그램을 플로팅하려면 수동으로 계산해야 합니다.
hist
와histc
의 동작이 일관되지 않습니다.
권장되는 히스토그램 함수
histogram
, histcounts
, discretize
함수는 MATLAB에서 히스토그램을 생성하고 계산하는 기능을 크게 향상시키는 동시에 일관성과 사용 편의성도 높습니다. histogram
, histcounts
, discretize
는 히스토그램 생성 및 계산을 위한 함수로, 새 코드에 권장됩니다.
특히 주목할 만한 것은 다음과 같은 변경 내용으로, 이는 hist
와 histc
에 대한 개선 사항입니다.
histogram
은 histogram 객체를 반환할 수 있습니다. 이 객체를 사용하여 히스토그램의 속성을 수정할 수 있습니다.histogram
과histcounts
에는 모두 자동 비닝(Binning) 및 정규화 기능이 있으며, 두 함수는 공통적인 여러 내장 옵션을 갖고 있습니다.histcounts
는histogram
에 대한 주 계산 함수입니다. 따라서 이 두 함수는 일관되게 동작합니다.discretize
는 각 요소의 Bin 배치를 결정할 수 있는 추가적인 옵션과 유연성을 제공합니다.
코드 업데이트가 필요한 차이점
앞에서 언급한 개선 사항에도 불구하고, 이전 함수와 권장되는 새 함수 간에는 여러 가지 중요한 차이점이 있으며, 이로 인해 코드를 업데이트해야 할 수도 있습니다. 다음 표에는 함수 간의 차이점이 요약되어 있으며 코드 업데이트를 위한 제안 사항도 나와 있습니다.
hist
의 코드 업데이트
차이점 | 이전 hist 의 동작 | 새로운 histogram 의 동작 |
---|---|---|
입력 행렬 |
A = randn(100,2); hist(A) |
A = randn(100,2); h1 = histogram(A(:,1),10) edges = h1.BinEdges; hold on h2 = histogram(A(:,2),edges) 위의 코드 예제에서는 각 히스토그램에 동일한 Bin 경계값을 사용하지만, 경우에 따라서는 이 대신 각 히스토그램의 |
Bin 지정 |
|
참고
histogram(A,'BinLimits',[-3,3],'BinMethod','integers') |
출력 인수 |
A = randn(100,1); [N, Centers] = hist(A) |
A = randn(100,1); h = histogram(A); N = h.Values Edges = h.BinEdges 참고 히스토그램을 플로팅하지 않고 Bin 도수를 계산하려면 |
Bin의 디폴트 개수 |
|
A = randn(100,1); histogram(A) histcounts(A) |
Bin 제한 |
|
유한 데이터 값( A = randi(5,100,1); histogram(A,10,'BinLimits',[min(A) max(A)]) |
histc
의 코드 업데이트
차이점 | 이전 histc 의 동작 | 새로운 histcounts 의 동작 |
---|---|---|
입력 행렬 |
A = randn(100,10); edges = -4:4; N = histc(A,edges) |
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 도수 계산 시에 계속해서 |
마지막 Bin에 포함된 값 |
|
A = 1:4; edges = [1 2 2.5 3] N = histcounts(A) N = histcounts(A,edges)
N = histcounts(A,'BinMethod','integers'); |
출력 인수 |
A = randn(15,1); edges = -4:4; [N,Bin] = histc(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)
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)