Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

spdiags

非ゼロの対角を抽出してスパース帯行列またはスパース対角行列を作成

説明

Bout = spdiags(A) は、mn 列の行列 A から非ゼロの対角を抽出し、それらを min(m,n)p 列の行列 Bout の列として返します。p は、非ゼロの対角の数です。

[Bout,id] = spdiags(A) は、A の非ゼロの対角の対角番号 id も返します。Bout のサイズは min(m,n)length(id) 列です。

Bout = spdiags(A,d) は、d で指定された A の対角を抽出し、それらを min(m,n)length(d) 列の行列 Bout の列として返します。

S = spdiags(Bin,d,m,n) は、Bin の列を取得して d で指定された対角に沿って配置することで、mn 列のスパース行列 S を作成します。

S = spdiags(Bin,d,A) は、d で指定された A の対角を Bin の列に置き換えます。

すべて折りたたむ

3 つのベクトルを使用して三重対角行列を作成し、その行列の対角の一部を変更してから対角を抽出します。

9 行 1 列の 1 のベクトルを作成してから、そのベクトルを使用して三重対角行列を作成します。行列の要素を表示します。

n = 9;
e = ones(n,1);
A = spdiags([e -2*e e],-1:1,n,n);
full(A)
ans = 9×9

    -2     1     0     0     0     0     0     0     0
     1    -2     1     0     0     0     0     0     0
     0     1    -2     1     0     0     0     0     0
     0     0     1    -2     1     0     0     0     0
     0     0     0     1    -2     1     0     0     0
     0     0     0     0     1    -2     1     0     0
     0     0     0     0     0     1    -2     1     0
     0     0     0     0     0     0     1    -2     1
     0     0     0     0     0     0     0     1    -2

A の主対角 (d = 0) 上の値を変更します。

Bin = abs(-(n-1)/2:(n-1)/2)';
d = 0;
A = spdiags(Bin,d,A);
full(A)
ans = 9×9

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

最後に、A の対角を行列の列として復元します。

Bout = spdiags(A);
full(Bout)
ans = 9×3

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

行列の非ゼロの対角を抽出し、spdiags の出力形式を確認します。

非ゼロとゼロの対角が混在する行列を作成します。

A = [0     5     0    10     0     0
     0     0     6     0    11     0
     3     0     0     7     0    12
     1     4     0     0     8     0
     0     2     5     0     0     9];

非ゼロの対角を行列から抽出します。2 つの出力を指定して、対角番号を返します。

[Bout,d] = spdiags(A)
Bout = 5×4

     0     0     5    10
     0     0     6    11
     0     3     7    12
     1     4     8     0
     2     5     9     0

d = 4×1

    -3
    -2
     1
     3

1 番目の出力 Bout の列は、A の非ゼロの対角を含みます。2 番目の出力 d は、A の非ゼロの対角のインデックスを一覧表示します。A の最長の非ゼロの対角は Bout の列 3 にあります。Bout のすべての列を同じ長さにするために、A の他の非ゼロの対角に対応する Bout の列にゼロが追加されます。m < nmn 列の行列の場合、規則は次のとおりです。

  • A の主対角の "下側" の非ゼロの対角では、列の "上部" にゼロが追加されます (例: Bout の最初の 2 列)。

  • A の主対角の "上側" の非ゼロの対角では、列の "下部" にゼロが追加されます (例: Bout の最後の列)。

spdiags は、最長の対角を Bout に返さない場合でも、この方法で Bout にゼロをパディングします。

5 行 5 列の乱数行列を作成します。

A = randi(10,5,5)
A = 5×5

     9     1     2     2     7
    10     3    10     5     1
     2     6    10    10     9
    10    10     5     8    10
     7    10     9    10     7

主対角とその上下の 1 番目の対角を抽出します。

d = [-1 0 1];
Bout = spdiags(A,d)
Bout = 5×3

    10     9     0
     6     3     1
     5    10    10
    10     8    10
     0     7    10

5 番目の上対角 (d = 5) の抽出を試みます。A には上対角が 4 つしかないため、spdiags は、主対角 (d = 0) と同じ長さをもち、すべてがゼロの対角を返します。

B5 = spdiags(A,5)
B5 = 5×1

     0
     0
     0
     0
     0

入力行列の列が、置き換える元の対角より長い場合、spdiags がどのように対角を作成するかを確認します。

1 ~ 6 の数値からなる 6 行 7 列の行列を作成します。

Bin = repmat((1:6)',[1 7])
Bin = 6×7

     1     1     1     1     1     1     1
     2     2     2     2     2     2     2
     3     3     3     3     3     3     3
     4     4     4     4     4     4     4
     5     5     5     5     5     5     5
     6     6     6     6     6     6     6

spdiags を使用して、Bin のいくつかの列を対角とする 6 行 6 列の正方行列を作成します。一部の対角には要素が 1 つか 2 つしかないため、Bin の列と A の対角との間にサイズの不一致が生じます。

d = [-4 -2 -1 0 3 4 5];
A = spdiags(Bin,d,6,6);
full(A)
ans = 6×6

     1     0     0     4     5     6
     1     2     0     0     5     6
     1     2     3     0     0     6
     0     2     3     4     0     0
     1     0     3     4     5     0
     0     2     0     4     5     6

Bin の各列には 6 つの要素がありますが、A では主対角のみに 6 つの要素があります。そのため、A の他のすべての対角では、選択された対角に収まるように Bin の列の要素が打ち切られます。

spdiags が対角を打ち切る方法は、mn 列の行列 A のサイズに依存します。mn の場合の動作を上図に示します。

  • 主対角の "下側" の対角は、列の "上部" から先に要素を取得します。

  • 主対角の "上側" の対角は、列の "下部" から先に要素を取得します。

m<n の場合、この動作が逆になります。

A = spdiags(Bin,d,5,6);
full(A)
ans = 5×6

     1     0     0     1     1     1
     2     2     0     0     2     2
     3     3     3     0     0     3
     0     4     4     4     0     0
     5     0     5     5     5     0

  • 主対角の "上側" の対角は、列の "上部" から先に要素を取得します。

  • 主対角の "下側" の対角は、列の "下部" から先に要素を取得します。

入力引数

すべて折りたたむ

入力行列。この行列は通常スパースですが、必ずしもスパースに限りません。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
複素数のサポート: あり

対角番号。正の整数のスカラーまたはベクトルとして指定します。対角番号は、diag と同じ規則に従います。

  • d < 0 は主対角の下側であり、かつ d >= -(m-1) を満たす。

  • d = 0 は主対角。

  • d > 0 は主対角の上側であり、かつ d <= (n-1) を満たす。

mn 列の行列 A には (m + n - 1) 個の対角があります。これらの対角は、-(m-1)(n-1) のインデックスを使用して、ベクトル d で指定します。たとえば、A が 5 行 6 列の場合、10 個の対角をもち、これらは、-4、-3、...4、5 のインデックスでベクトル d に指定されます。 次の図は、この対角の番号付けを示します。

5-by-6 matrix. The main diagonal is labeled as zero, diagonals above it are labeled 1 to 5, and diagonals below it are labeled -1 to -4.

A の外側の対角 (上の例の d = 7 など) を指定すると、spdiags は、要素をすべてゼロとしてその対角を返します。

例: spdiags(A,[3 5]) は、A から 3 番目と 5 番目の対角を抽出します。

対角要素。行列として指定します。この行列は通常非スパースですが、必ずしも非スパースに限りません。spdiags は、Bin の列を使用して、指定された A の対角を置き換えます。要求する出力のサイズが mn 列の場合、Bin の列数は min(m,n) でなければなりません。

構文 S = spdiags(Bin,d,m,n) で、Bin の列の要素数が置き換える元の対角より多く、かつ m >= n の場合、spdiags は、Bin の列の "下部" から上対角要素を取得し、Bin の列の "上部" から下対角要素を取得します。ただし、m < n の場合、上対角要素は Bin の列の "上部" からになり、下対角要素は "下部" からになります。この動作の例については、サイズの異なる列と対角を参照してください。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
複素数のサポート: あり

次元のサイズ。非負のスカラー整数として指定します。spdiags は、これらの入力を使用して、作成する行列の大きさを決定します。

例: spdiags(Bin,d,300,400) は、指定された対角 d に沿って B の列を配置して、300 行 400 列の行列を作成します。

出力引数

すべて折りたたむ

対角要素。非スパース行列として返されます。Bout の列には A から抽出した対角が含まれます。A の外側の位置に対応する Bout のすべての要素は、ゼロに設定されます。

対角番号。列ベクトルとして返されます。対角の番号付けの詳細については、d を参照してください。

出力行列。S は次の 2 つの形式のいずれかになります。

  • S = spdiags(Bin,d,A) では、指定された A の対角を Bin の列に置き換えて S が作成されます。

  • S = spdiags(Bin,d,m,n) では、Bin の列を取得して d で指定した対角に沿って配置することで、mn 列のスパース行列 S が作成されます。

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

バージョン履歴

R2006a より前に導入

参考

|