Main Content

graph

無向エッジをもつグラフ

説明

graph オブジェクトは、ノードを連結する方向のないエッジをもつ無向グラフを表します。graph オブジェクトの作成後、オブジェクトに対してクエリを実行するオブジェクト関数を使用して、グラフの詳細を知ることができます。たとえば、ノードまたはエッジの追加や削除、2 つのノード間の最短経路の特定、特定のノードやエッジの検出ができます。

G = graph([1 1], [2 3]);
e = G.Edges
G = addedge(G,2,3)
G = addnode(G,4)
plot(G)

作成

説明

G = graph は、ノードとエッジをもたない空の無向グラフ オブジェクト G を作成します。

G = graph(A) は、正方対称の隣接行列 A を使用してグラフを作成します。

  • 論理隣接行列の場合は、エッジの重みがないグラフになります。

  • 非論理隣接行列の場合は、エッジの重みがあるグラフになります。A の各非ゼロ要素の位置はグラフのエッジを指定し、エッジの重みは要素の値に等しくなります。たとえば、A(2,1) = 10 である場合、G には、ノード 2 とノード 1 を連結する重み 10 のエッジがあります。

G = graph(A,nodenames) はさらにノード名を指定します。nodenames の要素数は size(A,1) と等しくなければなりません。

G = graph(A,NodeTable) は、table NodeTable を使用してノード名を (可能な場合は他のノード属性も) 指定します。この table は、A と同じ行数でなければなりません。table 変数 Name を使用してノード名を指定します。

G = graph(A,___,type) はグラフの作成に使用する隣接行列が上三角か下三角かを指定します。A の指定は必須ですが、nodenames または NodeTable はオプションで指定できます。グラフの作成に A の上三角または下三角のみを使用する場合、type'upper' または 'lower' のいずれかにすることができます。

G = graph(A,___,'omitselfloops')A の対角要素を無視し、自己ループのないグラフを返します。前述の構文にある任意の入力引数の組み合わせが使用できます。

G = graph(s,t) は、グラフ エッジ (s,t) をノード ペアで指定します。st にはノード インデックスまたはノード名を指定できます。graph は、G 内のエッジをまずソース ノードで並べ替えてから、ターゲット ノードで並べ替えます。s および t と同じ順序のエッジ プロパティがある場合は、構文 G = graph(s,t,EdgeTable) を使用してエッジ プロパティを渡し、結果のグラフで同じように並べ替えられるようにします。

G = graph(s,t,weights) は、配列 weights によってエッジの重みも指定します。

G = graph(s,t,weights,nodenames) は、文字ベクトルの cell 配列または string 配列 nodenames を使用してノード名を指定します。st には nodenames に存在するノード名のみを含めることができます。

G = graph(s,t,weights,NodeTable) は、table NodeTable を使用してノード名を (可能な場合は他のノード属性も) 指定します。table 変数 Name を使用してノード名を指定します。st には NodeTable に存在するノード名のみを含めることができます。

G = graph(s,t,weights,num) は、数値スカラー num によってグラフ内のノード数を指定します。

G = graph(s,t,___,'omitselfloops') は自己ループをグラフに追加しません。つまり、s(k) == t(k) を満たす k はすべて無視されます。前述の構文にある任意の入力引数の組み合わせが使用できます。

G = graph(s,t,EdgeTable,___) は、weights を指定する代わりに table を使用してエッジの属性を指定します。EdgeTable の入力は table で、その行はそれぞれ st の要素のペアに対応しなければなりません。table 変数 Weight を使用してエッジの重みを指定します。

G = graph(EdgeTable) は、table EdgeTable を使用してグラフを定義します。この構文の場合、EdgeTable の最初の変数は EndNodes という名前で、グラフ エッジのリストを定義する 2 列配列でなければなりません。

G = graph(EdgeTable,NodeTable) は、さらに table NodeTable を使用してグラフ ノードの名前を (可能な場合はその他の属性も) 指定します。

G = graph(EdgeTable,___,'omitselfloops') は自己ループをグラフに追加しません。つまり、EdgeTable.EndNodes(k,1) == EdgeTable.EndNodes(k,2) を満たす k はすべて無視されます。EdgeTable の指定は必須です。NodeTable はオプションで指定できます。

入力引数

すべて展開する

隣接行列。非スパースまたはスパースの数値行列として指定します。A の要素は、グラフのノード間における連結 (エッジ) のネットワークを指定します。A の個々の非ゼロ要素の位置は、2 つのノード間のエッジを指定します。その要素の値はエッジの重みです。論理隣接行列は重みなしのグラフになります。

A の非ゼロの主対角要素は、"自己ループ"、つまりエッジでそれ自体に連結するノードを指定します。対角要素を無視するには、入力オプション 'omitselfloops' を使用します。

type の入力が指定されていない場合、A は対称でなければなりません。行列が対称であることを確認するには、issymmetric を使用します。三角隣接行列の場合、type を指定して上三角または下三角のみを使用します。

例: A = [0 1 5; 1 0 0; 5 0 0] は、ノードを 3 つ、エッジを 2 本もつグラフを表します。ノード 1 とノード 2 の間のエッジの重みは 1、ノード 1 とノード 3 の間のエッジの重みは 5 です。

データ型: single | double | logical

ノード名。文字ベクトルの cell 配列または string 配列として指定します。nodenames は、グラフの各ノードに対して空ではない一意の名前が含まれるように、numnodes(G) と長さが同じでなければなりません。

例: G = graph(A,{'n1','n2','n3'}) は、3 行 3 列の隣接行列 A に対し 3 つのノード名を指定します。

データ型: cell | string

隣接行列のタイプ。'upper' または 'lower' として指定します。

例: G = graph(A,'upper') はグラフ G の作成に A の上三角のみを使用します。

ノード ペア。ノード インデックスまたはノード名として指定します。graphst の対応するノード間にエッジを作成します。s と t はいずれも数値であるか、いずれも文字ベクトル、文字ベクトルの cell 配列、string 配列または categorical 配列でなければなりません。すべての場合において、st の要素数は同じでなければなりません。

  • st が数値の場合、その値はグラフ ノードのインデックスに対応します。数値のノード インデックスは、1 以上の正の整数でなければなりません。

  • st が文字ベクトル、文字ベクトルの cell 配列または string 配列である場合、ノード名を指定します。グラフの Nodes プロパティは、ノード名 Name をもつ変数 G.Nodes.Name のテーブルです。

  • st が categorical 配列の場合、st のカテゴリがグラフ内のノード名として使用されます。これには、s または t の要素ではないカテゴリが含まれる場合があります。

  • s および t で同じ 2 つのノード間の複数のエッジを指定すると、結果は、多重グラフになります。

次の表に、1 つ以上のノードを数値ノード インデックスまたはノード名のいずれかで参照するさまざまな方法を示します。

形式単一ノード複数ノード
ノード インデックス

スカラー

例: 1

ベクトル

例: [1 2 3]

ノード名

文字ベクトル

例: 'A'

文字ベクトルの cell 配列

例: {'A' 'B' 'C'}

string スカラー

例: "A"

string 配列

例: ["A" "B" "C"]

categorical 配列

例: categorical("A")

categorical 配列

例: categorical(["A" "B" "C"])

例: G = graph([1 2 3],[2 4 5]) はノードを 5 つ、エッジを 3 本もつグラフを作成します。

例: G = graph({'Boston' 'New York' 'Washington D.C.'},{'New York' 'New Jersey' 'Pittsburgh'}) は名前付きノードを 5 つ、エッジを 3 本もつグラフを作成します。

エッジの重み。スカラー、ベクトル、行列または多次元配列として指定します。weights には、スカラー、または s および t と同じ要素数の配列を指定しなければなりません。

graph は、G.Edges プロパティ テーブルの変数 Weight としてエッジの重みを格納します。グラフの作成後に重みの追加や変更を行うために、たとえば G.Edges.Weight = [25 50 75]' のように、table 変数を直接変更できます。

weights を空の配列 [] として指定した場合、これは無視されます。

例: G = graph([1 2],[2 3],[100 200]) は、ノードを 3 つ、エッジを 2 本もつグラフを作成します。エッジの重みはそれぞれ 100200 です。

データ型: single | double

グラフ ノードの数。正のスカラー整数として指定します。num は、st の要素の最大数以上の値でなければなりません。

例: G = graph([1 2],[2 3],[],5) は連結ノードを 3 つ、孤立ノードを 2 つもつグラフを作成します。

エッジ情報のテーブル。s および t を指定しない場合は、EdgeTable の最初の変数を、グラフ エッジを定義する EndNodes という 2 列の行列、文字ベクトルの cell 配列または string 配列にする必要があります。エッジの重みには、変数 Weight を使用します。これは、このテーブル変数名が一部のグラフ関数で使用されているためです。変数 Weight がある場合、これは数値列ベクトルにしなければなりません。table の作成の詳細については、table を参照してください。

グラフの作成後、G.Edges を使用してエッジ情報のテーブルをクエリします。

例: EdgeTable = table([1 2; 2 3; 3 5; 4 5],'VariableNames',{'EndNodes'})

データ型: table

ノード情報のテーブル。NodeTable には、グラフ ノードの属性を記述する変数をいくつでも含めることができます。ノード名には、変数 Name を使用します。これは、この変数名が一部のグラフ関数で使用されるためです。変数 Name がある場合、これは各行で一意の名前を指定する文字ベクトルの cell 配列または string 配列でなければなりません。table の作成の詳細については、table を参照してください。

グラフの作成後、G.Nodes を使用してノード情報のテーブルをクエリします。

例: NodeTable = table({'a'; 'b'; 'c'; 'd'},'VariableNames',{'Name'})

データ型: table

プロパティ

すべて展開する

グラフのエッジ。table として返されます。既定では、これは M1 列のテーブルであり、ここで M はグラフのエッジ数です。G.Edges.EndNodes 内のエッジ リストは、まずソース ノードで並べ替えてから、ターゲット ノードで並べ替えます。

  • グラフに新しいエッジ プロパティを追加するには、Edges テーブルに新しい変数を作成します。

  • グラフにエッジを追加するにはオブジェクト関数 addedge を、グラフからエッジを削除するにはオブジェクト関数 rmedge を使用します。

例: G.Edges はグラフ内のエッジがリストされたテーブルを返します。

例: G.Edges.Weight はエッジの重みの数値ベクトルを返します。

例: G.Edges.Weight = [10 20 30 55]' は、グラフの新しいエッジの重みを指定します。

例: G.Edges.NormWeight = G.Edges.Weight/sum(G.Edges.Weight) は、エッジの正規化された重みを含む新しいエッジ プロパティを table に追加します。

データ型: table

グラフのノード。table として返されます。既定では、これは N0 列の空のテーブルであり、ここで N はグラフのノード数です。

  • グラフに新しいノード プロパティを追加するには、Nodes テーブルに新しい変数を作成します。

  • グラフにノードを追加するにはオブジェクト関数 addnode を、グラフからノードを削除するにはオブジェクト関数 rmnode を使用します。

例: G.Nodes は、グラフのノード プロパティがリストされたテーブルを返します。このテーブルは既定では空です。

例: G.Nodes.Names = {'Montana', 'New York', 'Washington', 'California'}' は、Nodes table に変数 Names を追加することにより、グラフにノード名を追加します。

例: G.Nodes.WiFi = logical([1 0 0 1 1]') は、変数 WiFiNodes テーブルに追加します。このプロパティは、特定の空港にワイヤレス インターネットのサービス エリアがあることを示します。

データ型: table

オブジェクト関数

すべて展開する

addedge新しいエッジをグラフに追加
rmedgeグラフからエッジを削除
addnode新しいノードをグラフに追加
rmnodeグラフからノードを削除
findedgeグラフ内のエッジを検出
findnodeグラフ内のノードを検出
numedgesグラフ エッジの数
numnodesグラフのノード数
edgecount2 つのノード間のエッジ数
reordernodesグラフ ノードの並べ替え
subgraph部分グラフの抽出
centralityノードの重要度を測定
conncompグラフの連結要素
biconncompグラフの 2 重連結要素
bctreeブロックカット木グラフ
isisomorphic2 つのグラフが準同型であるかどうかを判別
isomorphism2 つのグラフ間の同型を計算
ismultigraphグラフに複数のエッジがあるかどうかを判別
simplify多重グラフを単純グラフに縮小
bfsearchグラフの幅優先検索
dfsearchグラフの深さ優先検索
shortestpath2 つの単一ノード間の最短経路
shortestpathtreeノードからの最短経路木
distancesすべてのノード ペアの最短経路の距離
maxflowグラフの最大フロー
minspantreeグラフの最小全域木
allpaths2 つのグラフ ノード間のすべての経路の検出
hascyclesグラフに循環があるかどうかを判別
allcyclesグラフ内のすべての循環の検出
cyclebasisFundamental cycle basis of graph
adjacencyグラフの隣接行列
incidenceグラフの接続行列
laplacianグラフのラプラシアン行列
degreeグラフ ノードの次数
neighborsグラフ ノードの隣接ノード
nearest半径内の最近傍
outedgesノードからの出方向のエッジ
plotグラフのノードとエッジをプロット

すべて折りたたむ

ノードを 3 つ、エッジを 2 本もつ graph オブジェクトを作成します。1 番目のエッジはノード 1 とノード 2 の間にあり、2 番目のエッジはノード 1 とノード 3 の間にあります。

G = graph([1 1],[2 3])
G = 
  graph with properties:

    Edges: [2x1 table]
    Nodes: [3x0 table]

グラフのエッジ テーブルを表示します。

G.Edges
ans=2×1 table
    EndNodes
    ________

     1    2 
     1    3 

ノード名をグラフに追加し、新しいノード テーブルとエッジ テーブルを表示します。各エッジの終了ノードが、ノード名を使用して表されます。

G.Nodes.Name = {'A' 'B' 'C'}';
G.Nodes
ans=3×1 table
    Name 
    _____

    {'A'}
    {'B'}
    {'C'}

G.Edges
ans=2×1 table
       EndNodes   
    ______________

    {'A'}    {'B'}
    {'A'}    {'C'}

テーブル Nodes および Edges に変数を追加し、あるいはそれを変更して、グラフのノードやエッジの属性を記述することができます。ただし、これらのテーブルを変更してグラフ内のノード数やエッジ数を直接変更することはできません。代わりに、関数 addedgermedgeaddnode または rmnode を使用してグラフ内のノード数またはエッジ数を変更します。

たとえば、グラフのノード 2 とノード 3 の間にエッジを追加し、新しいエッジ リストを表示します。

G = addedge(G,2,3)
G = 
  graph with properties:

    Edges: [3x1 table]
    Nodes: [3x1 table]

G.Edges
ans=3×1 table
       EndNodes   
    ______________

    {'A'}    {'B'}
    {'A'}    {'C'}
    {'B'}    {'C'}

対称隣接行列 A を作成します。この行列は、次数 4 の完全グラフを作成します。論理隣接行列を使用して、重みのないグラフを作成します。

A = ones(4) - diag([1 1 1 1])
A = 4×4

     0     1     1     1
     1     0     1     1
     1     1     0     1
     1     1     1     0

G = graph(A~=0)
G = 
  graph with properties:

    Edges: [6x1 table]
    Nodes: [4x0 table]

グラフのエッジ リストを表示します。

G.Edges
ans=6×1 table
    EndNodes
    ________

     1    2 
     1    3 
     1    4 
     2    3 
     2    4 
     3    4 

上三角隣接行列を作成します。

A = triu(magic(4))
A = 4×4

    16     2     3    13
     0    11    10     8
     0     0     6    12
     0     0     0     1

この隣接行列を使用して、名前付きノードをもつグラフを作成します。'omitselfloops' を指定して A の対角要素を無視し、type'upper' に指定して A が上三角であることを示します。

names = {'alpha' 'beta' 'gamma' 'delta'};
G = graph(A,names,'upper','omitselfloops')
G = 
  graph with properties:

    Edges: [6x2 table]
    Nodes: [4x1 table]

エッジとノードの情報を表示します。

G.Edges
ans=6×2 table
           EndNodes           Weight
    ______________________    ______

    {'alpha'}    {'beta' }       2  
    {'alpha'}    {'gamma'}       3  
    {'alpha'}    {'delta'}      13  
    {'beta' }    {'gamma'}      10  
    {'beta' }    {'delta'}       8  
    {'gamma'}    {'delta'}      12  

G.Nodes
ans=4×1 table
      Name   
    _________

    {'alpha'}
    {'beta' }
    {'gamma'}
    {'delta'}

各エッジの末端ノードのリストを使用して立方体グラフを作成し、プロットします。

s = [1 1 1 2 2 3 3 4 5 5 6 7];
t = [2 4 8 3 7 4 6 5 6 8 7 8];
G = graph(s,t)
G = 
  graph with properties:

    Edges: [12x1 table]
    Nodes: [8x0 table]

plot(G)

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

各エッジの末端ノードのリストを使用して立方体グラフを作成し、プロットします。ノード名とエッジの重みを別々の入力として指定します。

s = [1 1 1 2 2 3 3 4 5 5 6 7];
t = [2 4 8 3 7 4 6 5 6 8 7 8];
weights = [10 10 1 10 1 10 1 1 12 12 12 12];
names = {'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H'};
G = graph(s,t,weights,names)
G = 
  graph with properties:

    Edges: [12x2 table]
    Nodes: [8x1 table]

plot(G,'EdgeLabel',G.Edges.Weight)

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

各エッジの末端ノードのリストを使用して、重み付きグラフを作成します。グラフに合計 10 個のノードが含まれるよう指定します。

s = [1 1 1 1 1];
t = [2 3 4 5 6];
weights = [5 5 5 6 9];
G = graph(s,t,weights,10)
G = 
  graph with properties:

    Edges: [5x2 table]
    Nodes: [10x0 table]

グラフをプロットします。追加のノードは、主要な連結要素と連結されていません。

plot(G)

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

空のグラフ オブジェクト G を作成します。

G = graph;

このグラフにノードを 3 つ、エッジを 3 本追加します。st の対応する要素は、グラフ エッジの終了ノードを定義します。それらがまだ存在していない場合、addedge は該当するノードをグラフに自動的に追加します。

s = [1 2 1];
t = [2 3 3];
G = addedge(G,s,t)
G = 
  graph with properties:

    Edges: [3x1 table]
    Nodes: [3x0 table]

エッジ リストを表示します。各行はグラフのエッジを表します。

G.Edges
ans=3×1 table
    EndNodes
    ________

     1    2 
     1    3 
     2    3 

最高のパフォーマンスを得るには、graph の呼び出しを 1 回使用してグラフをすべて一度に作成します。大規模なグラフでは、ループを使用してノードやエッジをグラフに追加する処理が低速になることがあります。

変数 EndNodesWeight および Code を格納するエッジ テーブルを作成します。次に、変数 Name および Country を格納するノード テーブルを作成します。各テーブルの変数は、グラフのノードとエッジのプロパティを指定します。

s = [1 1 1 2 3];
t = [2 3 4 3 4];
weights = [6 6.5 7 11.5 17]';
code = {'1/44' '1/49' '1/33' '44/49' '49/33'}';
EdgeTable = table([s' t'],weights,code, ...
    'VariableNames',{'EndNodes' 'Weight' 'Code'})
EdgeTable=5×3 table
    EndNodes    Weight      Code   
    ________    ______    _________

     1    2         6     {'1/44' }
     1    3       6.5     {'1/49' }
     1    4         7     {'1/33' }
     2    3      11.5     {'44/49'}
     3    4        17     {'49/33'}

names = {'USA' 'GBR' 'DEU' 'FRA'}';
country_code = {'1' '44' '49' '33'}';
NodeTable = table(names,country_code,'VariableNames',{'Name' 'Country'})
NodeTable=4×2 table
     Name      Country
    _______    _______

    {'USA'}    {'1' } 
    {'GBR'}    {'44'} 
    {'DEU'}    {'49'} 
    {'FRA'}    {'33'} 

ノード テーブルとエッジ テーブルを使用して、グラフを作成します。国コードをノード ラベルとエッジ ラベルとして使用して、グラフをプロットします。

G = graph(EdgeTable,NodeTable);
plot(G,'NodeLabel',G.Nodes.Country,'EdgeLabel',G.Edges.Code)

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

拡張機能

スレッドベースの環境
MATLAB® の backgroundPool を使用してバックグラウンドでコードを実行するか、Parallel Computing Toolbox™ の ThreadPool を使用してコードを高速化します。

バージョン履歴

R2015b で導入

すべて展開する