Main Content

推奨されない hist および histc インスタンスの置き換え

古いヒストグラム関数 (histhistc)

MATLAB® の旧バージョンでは関数 hist および histc をヒストグラムの作成とヒストグラムのビンのカウント数を計算する主な方法として使用していました。これらの関数は一部の一般的な目的には適していますが、全体的な機能は限られています。新しいコードで histhistc を使用することは、次のような理由で推奨されていません。

  • hist を使用してヒストグラムを作成した後に、ヒストグラムのプロパティを変更することが困難なため、ヒストグラム全体の再計算が必要となります。

  • hist の既定の動作では 10 個のビンを使用しますが、多くのデータ セットには適していません。

  • 正規化ヒストグラムのプロットには手動計算が必要です。

  • histhistc の動作には整合性がありません。

推奨ヒストグラム関数

関数 histogramhistcounts、および discretize により、MATLAB でのヒストグラム作成と計算の機能が大幅に強化され、同時に整合性と使いやすさが促進されています。histogramhistcounts、および discretize は、新しいコードでのヒストグラムの作成と計算に推奨されている関数です。

特に、histhistc の注目すべき "改善点" として次の変更が挙げられます。

  • histogram は histogram オブジェクトを返すことができます。このオブジェクトを使用してヒストグラムのプロパティを変更できます。

  • histogramhistcounts はどちらも自動ビン化機能と正規化機能を備え、複数の共通組み込みオプションがあります。

  • histcountshistogram 用の主な計算関数です。結果として、これらの関数は整合性のある動作を示します。

  • discretize は各要素のビン配置を決定するための追加のオプションと柔軟性を提供します。

コード更新が必要な場合の相違点

前述の改善点以外に、古い関数と新しい推奨関数にはいくつかの重要な "相違点" があり、コード更新が必要な場合があります。次の表は関数間の相違点のまとめとコード更新に関する推奨事項を示しています。

hist のコード更新

相違点hist の従来の動作histogram の新しい動作

入力行列

hist は入力行列の各列に対してヒストグラムを作成し、同じ Figure 内にヒストグラムを並べてプロットします。

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

histogram は入力行列を 1 つの tall ベクトルとして処理して 1 つのヒストグラムを作成します。複数のヒストグラムをプロットするには、データの各列に対して異なる histogram オブジェクトを作成します。hold on コマンドを使用して、同じ Figure 内にそれらのヒストグラムをプロットします。

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

前述のコードの例では、各ヒストグラムで同じビン エッジを使用していますが、代わりに各ヒストグラムの BinWidth を同じに設定した方が良い場合もあります。また、各ヒストグラムの FaceAlpha プロパティを設定すると、表示が見やすくなる場合があります。このプロパティでは、重ね合わされたバーの透明性を調整できます。

ビンの仕様

hist はビンの "中心" を 2 番目の入力としてを受け取ります。

histogram はビンの "エッジ" を 2 番目の入力としてを受け取ります。

histogram で使用するためにビンの中心をビンのエッジに変換する方法については、ビンの中心からビンのエッジへの変換を参照してください。

メモ

hist で使用されるビンの中心が hist(A,-3:3) などの整数である場合、整数に対して histogram の新しい組み込みビン化方法を使用してください。

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

出力引数

hist はビンのカウント数を出力引数として返し、オプションでビンの中心を 2 番目の出力引数として返します。

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

histogram は 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 個のビンを使用します。

histogramhistcounts はどちらも既定で自動ビン化アルゴリズムを使用します。ビンの数は入力データのサイズと範囲により決定されます。

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

ビンの範囲

hist は、有限データの最大値と最小値を使用して、プロット内の最初の棒の左端と最後の棒の右端を決定します。-Inf および Inf は、それぞれ最初のビンと最後のビンに含まれます。

BinLimits が設定されていない場合、histogram は、有限データの最小値と最大値に基づいて (厳密に等しいわけではない)、有理数のビンの範囲を使用します。histogram は、ビン エッジのいずれかがビン エッジとして明示的に Inf または -Inf に指定されていないかぎり、Inf 値を無視します。

有限データ (Inf 値なし) の hist(A) の結果を再生成するには、10 個のビンを使用し、BinLimits をデータの最大値と最小値に明示的に設定します。

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

histc のコード更新

相違点histc の従来の動作histcounts の新しい動作
入力行列

histc は入力データの各列に対してビンのカウント数を計算します。入力行列のサイズが mn 列の場合、histc はサイズが length(edges)n 列のビンのカウント数の行列を返します。

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

histcounts は入力行列を 1 つの 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 を引き続き使用することを検討してください。

最後のビンに含まれる値

histcA(i) == edges(end) の場合、最後のビンに要素 A(i) を含めます。出力 N はビンのカウント数を含む length(edges) 要素をもつベクトルです。ビンの範囲外の値はカウントされません。

histcountsedges(end-1) <= A(i) <= edges(end) の場合、最後のビンに要素 A(i) を含めます。つまり、histcountshistc の最後の 2 つのビンを 1 つの最終的なビンに結合します。出力 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 はビンのカウント数を出力引数として返し、オプションでビンのインデックスを 2 番目の出力引数として返します。

A = randn(15,1);
edges = -4:4;
[N,Bin] = histc(A,edges)
  • N = histc(A,edges)[N,bin] = histc(A,edges) などのビンのカウント数の計算には histcounts を使用します。関数 histcounts はビンのカウント数を出力引数として返し、オプションでビンのエッジを 2 番目の出力として返すか、またはビンのインデックスを 3 番目の出力として返します。

    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)

ビンの中心をビンのエッジに変換するには、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)