Main Content

ディクショナリを使用したデータ マッピング

R2022b 以降. 次よりも推奨: containers.Map.

"ディクショナリ" は、さまざまな型のデータ間の関連付けを作成するデータ構造体です。ディクショナリにデータが "値" として保存されており、データにアクセスするには、各データに対応する一意の "キー" を使用します。キーと値は異なるデータ型にすることができ、キーと値の各ペアは "エントリ" と呼ばれます。

ディクショナリの基本機能は、関連付けられた 2 組のデータをリンクすることによって、一方のセットの要素を使用してもう一方の対応する要素を検索できるようにすることです。このアクションは、"ルックアップ" と呼ばれます。ディクショナリは、ディクショナリに含まれるエントリの数に関係なく、一貫したパフォーマンスを提供します。

この例では、ディクショナリを作成し、そのエントリを変更する方法を説明します。その後に、ディクショナリでのデータ型の取り扱いと、さまざまなデータ型の保存方法を説明します。

ディクショナリの作成

たとえば、製品 (Products) をキー、価格 (Prices) を値として使用してディクショナリを作成します。ディクショナリの出力は、キーと値のデータ型を示します。

Products = ["Tomato" "Carrot" "Mango" "Mushroom"];
Prices = [1 .5 2.50 1.99];
d = dictionary(Products,Prices)
d =

  dictionary (string --> double) with 4 entries:

    "Tomato"   --> 1
    "Carrot"   --> 0.5000
    "Mango"    --> 2.5000
    "Mushroom" --> 1.9900

ここでは、ルックアップを実行してニンジン (Carrot) の価格を確認します。ディクショナリ内の価格は、関連付けられたキーを使用して検索できます。

d("Carrot")
ans = 0.5000

ディクショナリの変更

新しいエントリをディクショナリに挿入するには、等号 (=) を使用して値を新しいキーにマッピングします。以下のコマンドでは、値として 0.75 の価格をもつキー "Potato" を追加しています。

d("Potato") = 0.75
d =

  dictionary (string --> double) with 5 entries:

    "Tomato"   --> 1
    "Carrot"   --> 0.5000
    "Mango"    --> 2.5000
    "Mushroom" --> 1.9900
    "Potato"   --> 0.7500

新しい値を既存のキーにマッピングすることで、エントリ変更できます。以下のコマンドでは、"Tomato" の価格を 1.25 に変更しています。

d("Tomato") = 1.25
d =

  dictionary (string --> double) with 5 entries:

    "Tomato"   --> 1.2500
    "Carrot"   --> 0.5000
    "Mango"    --> 2.5000
    "Mushroom" --> 1.9900
    "Potato"   --> 0.7500

キーを空配列 ([]) にマッピングして、エントリを削除します。このコマンドでは "Mango" のエントリを削除しています。

d("Mango") = []
d =

  dictionary (string --> double) with 4 entries:

    "Tomato"   --> 1.2500
    "Carrot"   --> 0.5000
    "Mushroom" --> 1.9900
    "Potato"   --> 0.7500

前のアクションのいずれも、1 回に 1 エントリずつ処理するのではなく、ベクトル化することができます。たとえば、以下のコマンドでは、関連付けられた価格をもつ "Grapes""Celery" の 2 つの新しいエントリを追加しています。

d(["Celery" "Grapes"]) = [0.50 1.95]
d =

  dictionary (string --> double) with 6 entries:

    "Tomato"   --> 1.2500
    "Carrot"   --> 0.5000
    "Mushroom" --> 1.9900
    "Potato"   --> 0.7500
    "Celery"   --> 0.5000
    "Grapes"   --> 1.9500

ディクショナリとデータ型

ディクショナリのキーと値には、ほぼすべてのデータ型を使用でき、ディクショナリはそのエントリに基づいて型指定されます。データ型が割り当てられると、ディクショナリは "構成済み" になります。

キーと値を同じデータ型にする必要はありません。ただし、ディクショナリ内のすべてのキーとすべての値が、それぞれのデータ型を共有するか、構成されたデータ型に変換できなければなりません。

ディクショナリに対して構成されているデータ型と一致しない新しいエントリが挿入されると、MATLAB® は、その構成と一致させるためにデータ型を変換しようとします。

たとえば、string であるキーと値を受け入れるディクショナリを作成します。そこに、数値を含むエントリを追加します。MATLAB はその値を string に変換します。

d = dictionary("hello","world")
d =

  dictionary (string --> string) with 1 entry:

    "hello" --> "world"
d("newKey") = 1
d =

  dictionary (string --> string) with 2 entries:

    "hello"  --> "world"
    "newKey" --> "1"
isstring(d("newKey"))
ans = logical
   1

ディクショナリでのさまざまなデータ型の保存

ディクショナリでは、すべてのエントリがキーと値についてそれぞれ同じデータ型を共有する必要があります。ただし、データを cell 配列に入れることで、複数のデータ型を 1 つのディクショナリに保存できます。cell 配列の各要素には、任意の型とサイズのデータを含めることができます。このアプローチは、すべての値が cell 配列であるため、ディクショナリの型要件を満たします。

さまざまなデータ型の値を含む cell 配列を作成してから、キーの string 配列を作成します。

myCell = {datetime,@myfun,struct,[1 2 3 4]}
myCell=1×4 cell array
    {[13-Feb-2024 00:30:53]}    {@myfun}    {1x1 struct}    {[1 2 3 4]}

names = ["my birthday" "my favorite function" "a structure" "numeric array"]
names = 1x4 string
    "my birthday"    "my favorite function"    "a structure"    "numeric array"

指定したキーと値を使用してディクショナリを作成します。

d = dictionary(names,myCell)
d =

  dictionary (string --> cell) with 4 entries:

    "my birthday"          --> {[13-Feb-2024 00:30:53]}
    "my favorite function" --> {@myfun}
    "a structure"          --> {1x1 struct}
    "numeric array"        --> {[1 2 3 4]}

"R2023a" では、中かっこ ({}) を使用して直接、値として保存されたセルの内容をルックアップします。

d{"numeric array"}
ans = 1×4

     1     2     3     4

同様に、中かっこ ({}) を使用してセル値をもつ既存のディクショナリに任意のデータ型の新しいエントリを挿入できます。

d{"a new entry"} = table
d =

  dictionary (string --> cell) with 5 entries:

    "my birthday"          --> {[13-Feb-2024 00:30:53]}
    "my favorite function" --> {@myfun}
    "a structure"          --> {1x1 struct}
    "numeric array"        --> {[1 2 3 4]}
    "a new entry"          --> {0x0 table}

データ型の制限

ディクショナリではほぼすべてのデータ型のエントリを使用できますが、一部制限があります。struct などの特定のデータ型は、エントリの一部として受け入れられますが、さまざまなフィールドをもつ構造体ではベクトル化演算はサポートされません。ベクトル化されたルックアップは、連結できない型ではサポートされません。

ディクショナリは、以下のデータ型をキーまたは値として受け入れません。

  • table

  • tall 配列

  • 分散配列

  • graph オブジェクトおよび digraph オブジェクト

未構成のディクショナリ

エントリを含まないディクショナリを作成すると、"未構成のディクショナリ" となり、キーと値にデータ型が割り当てられません。

d = dictionary
d =

  dictionary with unset key and value types.
isConfigured(d)
ans = logical
   0

configureDictionary を使用して、エントリのない構成済みのディクショナリを作成します。

d = configureDictionary("string","double")
d =

  dictionary (string --> double) with no entries.

R2023b より前: 目的のデータ型の empty 入力を作成すれば、エントリを追加せずにディクショナリを構成できます。たとえば、dictionary(string.empty,struct.empty) のようになります。

参考

| |

関連するトピック