推奨されない 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 オブジェクトを返すことができます。このオブジェクトを使用してヒストグラムのプロパティを変更できます。histogram
とhistcounts
はどちらも自動ビン化機能と正規化機能を備え、複数の共通組み込みオプションがあります。histcounts
はhistogram
用の主な計算関数です。結果として、これらの関数は整合性のある動作を示します。discretize
は各要素のビン配置を決定するための追加のオプションと柔軟性を提供します。
コード更新が必要な場合の相違点
前述の改善点以外に、古い関数と新しい推奨関数にはいくつかの重要な "相違点" があり、コード更新が必要な場合があります。次の表は関数間の相違点のまとめとコード更新に関する推奨事項を示しています。
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) 前述のコードの例では、各ヒストグラムで同じビン エッジを使用していますが、代わりに各ヒストグラムの |
ビンの仕様 |
|
メモ
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 メモ ヒストグラムをプロットせずにビンのカウント数を計算するには、 |
既定のビンの数 |
|
A = randn(100,1); histogram(A) histcounts(A) |
ビンの範囲 |
|
有限データ ( 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) 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 行列内の列が多数あるためにパフォーマンスの問題が発生した場合は、列方向のビンのカウント数用に |
最後のビンに含まれる値 |
|
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) |
|
ビンの中心からビンのエッジへの変換
関数 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)