MATLAB 対角行列
このチュートリアルでは、MATLAB の diag()
および spdiags()
関数を使用して対角行列を作成する方法について説明します。
MATLAB で diag()
関数を使用して対角行列を作成する
対角行列を作成したり、行列の対角エントリを取得したりするには、MATLAB の diag()
関数を使用できます。たとえば、与えられたベクトルから対角行列を作成しましょう。以下のコードを参照してください。
vector = [1 2 3 4 5];
diagonal = diag(vector)
出力:
diagonal =
1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
0 0 0 0 5
上記のコードでは、変数 vector
に格納されている対角要素を使用して 5x5
対角行列を作成しました。diag()
関数は、指定されたベクトル内に存在する要素の数に応じて正方行列を作成します。要素の数が 5 の場合、対角行列は 5x5
になります。diag()
関数内の 2 番目の引数を使用して、対角線の位置を変更することもできます。2 番目の引数が 0 に等しい場合、ベクトルは主対角線上に配置されます。2 番目の引数が 0 より大きい場合、ベクトルは主対角線の上に配置されます。2 番目の引数が 0 未満の場合、ベクトルは主対角線の下に配置されます。たとえば、ベクトルを主対角線の上に配置しましょう。以下のコードを参照してください。
vector = [1 2 3 4 5];
diagonal = diag(vector,1)
出力:
diagonal =
0 1 0 0 0 0
0 0 2 0 0 0
0 0 0 3 0 0
0 0 0 0 4 0
0 0 0 0 0 5
0 0 0 0 0 0
上記のコードでは、要素が主対角線の上に配置された対角行列を作成しました。ご覧のとおり、ベクトルが主対角線の上に配置されているため、対角線のサイズは 6x6
になり、すべての要素がマトリックス内に配置されるように、マトリックスのサイズが大きくなりました。diag()
関数を使用して、行列から対角要素を取得することもできます。たとえば、与えられた行列から主対角要素を取得しましょう。以下のコードを参照してください。
vector = [1 2 3;4 5 6;7 8 9]
diagonal = diag(vector)
出力:
vector =
1 2 3
4 5 6
7 8 9
diagonal =
1
5
9
上記のコードでは、diag()
関数を使用して、指定された行列から対角要素を検索しました。この関数が、指定された行列の対角要素を返したことがわかります。上で使用したように、diag()
関数内の 2 番目の引数を使用して主対角の上下の対角エントリを取得し、主対角の上に要素を持つ対角行列を作成することもできます。diag()
関数の詳細については、このリンクを確認してください。
MATLAB で spdiags()
関数を使用して対角行列を作成する
複数の対角を持つ対角行列を作成したり、行列のすべての対角エントリを取得したりするには、MATLAB の spdiags()
関数を使用できます。spdiags()
関数内で渡される最初の引数は値、2 番目の引数は対角位置、3 番目と 4 番目の引数は対角行列のサイズです。たとえば、与えられたベクトルから三重対角行列を作成しましょう。以下のコードを参照してください。
v1 = [1 2 3 4 5].';
v2 = [2 2 2 2 2].';
v3 = [3 3 3 3 3].';
diagonal = spdiags([v2 v1 v3],-1:1,5,5);
matrix = full(diagonal)
出力:
matrix =
1 3 0 0 0
2 2 3 0 0
0 2 3 3 0
0 0 2 4 3
0 0 0 2 5
上記のコードでは、v1
、v2
、および v3
の 3つの変数内に対角要素が格納された 5x5
三重対角行列を作成しました。必要な数の値を使用して対角行列を作成できます。springs()
関数を使用して、特定の行列の対角値を変更することもできます。これを行うには、最初の引数に新しい値を渡し、2 番目の引数として値の場所を渡し、3 番目の引数として値を変更する行列を渡します。たとえば、上記の三重対角行列の主対角要素を変更してみましょう。以下のコードを参照してください。
v1 = [1 2 3 4 5].';
v2 = [2 2 2 2 2].';
v3 = [3 3 3 3 3].';
diagonal = spdiags([v2 v1 v3],-1:1,5,5);
matrix1 = full(diagonal)
v4 = [9 9 9 9 9].';
diagonal = spdiags(v4,0,diagonal);
matrix2 = full(diagonal)
出力:
matrix1 =
1 3 0 0 0
2 2 3 0 0
0 2 3 3 0
0 0 2 4 3
0 0 0 2 5
matrix2 =
9 3 0 0 0
2 9 3 0 0
0 2 9 3 0
0 0 2 9 3
0 0 0 2 9
上記のコードでは、matrix1
の主対角線の値を変更しました。値が変更され、新しい行列が変数 matrix2
に保存されます。spdaigs()
関数を使用して、指定された行列からすべてのゼロ以外の対角要素を抽出することもできます。たとえば、上記の行列のゼロ以外のエントリを抽出してみましょう。以下のコードを参照してください。
v1 = [1 2 3 4 5].';
v2 = [2 2 2 2 2].';
v3 = [3 3 3 3 3].';
diagonal = spdiags([v2 v1 v3],-1:1,5,5);
matrix = full(diagonal)
diag_Values = spdiags(matrix)
出力:
matrix =
1 3 0 0 0
2 2 3 0 0
0 2 3 3 0
0 0 2 4 3
0 0 0 2 5
diag_Values =
2 1 0
2 2 3
2 3 3
2 4 3
0 5 3
指定された行列の対角値が抽出され、変数 diag_values
内に格納されます。対角値は行列の列に格納されます。最初の対角エントリは最初の列に格納され、以下同様に続きます。diag()
関数の詳細については、このリンクを確認してください。