ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

spdiags

スパース帯行列またはスパース対角行列の抽出と作成

構文

B = spdiags(A)
[B,d] = spdiags(A)
B = spdiags(A,d)
A = spdiags(B,d,A)
A = spdiags(B,d,m,n)

説明

関数 spdiags は、関数 diag を一般化したものです。入力引数の数により、異なる 4 つの演算が行えます。

B = spdiags(A) は、mn 列の行列 A からすべての非ゼロ対角要素を抽出します。B は、min(m,n)p 列の行列で、その列は Ap 個の非ゼロの対角要素になっています。

[B,d] = spdiags(A) は、長さ p のベクトル d を返します。この整数要素は、A の対角位置を指定します。

B = spdiags(A,d) は、d によって指定された対角要素を抽出します。

A = spdiags(B,d,A) は、d で指定した位置の対角要素を、B の列で置き換えます。出力はスパース行列です。

A = spdiags(B,d,m,n) は、B の列を d で指定した位置の対角要素に配置することで、mn 列のスパース行列を作成します。

    メモ:   この構文では、B の列が置き換わる対角部より長く、かつ m >= n の場合、関数 spdiags は、B の列の下部から上対角要素を取得して、B の列の上部から下対角要素を取得します。ただし、m < n の場合、上対角要素は、B の列の上部になり、下対角要素は下部になります (以下の「例 5A」と「例 5B」を参照)。

引数

関数 spdiags は、入力および出力として 3 個の行列をさまざまな組み合わせで扱います。

A

mn 列の行列で、通常 (必ずしも必要ではありませんが) スパースで、p 個の対角要素上に非ゼロまたは指定した要素をもちます。

B

min(m,n)p 列の行列で、通常 (必ずしも必要ではないが) 非スパース行列で、各列は A の対角要素です。

d

長さ p のベクトルで、整数要素は A の対角位置を指定します。

ABd には、次のような関係があります。

for k = 1:p
    B(:,k) = diag(A,d(k))
end

A の範囲外の位置に対応する B の要素は、このループでは定義されません。これらの要素は、B が入力の場合は参照されず、B が出力の場合はゼロに設定されます。

A の対角要素のベクトル d での並び方

m 行 n 列の行列 A は、m+n-1 の対角をもちます。これらの要素は、-m+1 から n-1 のインデックスを使用してベクトル d に指定されます。たとえば、A が 5 行 6 列の場合、10 個の対角要素をもち、これらは、-4、-3、...4、5 のインデックスでベクトル d に指定されます。4, 5. 以下の図は、すべて 1 のベクトルに対して上記を示します。

例 1

以下の行列を考えます。

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]

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

次のコマンドを実行します。

[B, d]  =spdiags(A)

以下の結果が返されます。

B =

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


d =


    -3
    -2
     1
     3

はじめの出力 B の列は、A の非ゼロの対角要素を含みます。2 番目の出力 d は、以下の図のように、A の非ゼロの対角要素のインデックスを一覧表示します。「A の対角要素のベクトル d での並び方」を参照してください。

A の最長の非ゼロの対角要素は、B の 3 列を含みます。A の他の非ゼロの対角要素は、対応する B の列にゼロを追加し、B のすべての列に同じ長さを与えます。A の主対角の下の非ゼロの対角要素は、列の先頭にゼロが追加されます。A の主対角の上の非ゼロの対角要素は、列の最後にゼロが追加されます。これは、以下の図に示されます。

例 2

次の例では、古典的な 2 階の n 点差分演算子を表す、スパース三重対角行列を作成します。

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

この結果は、Wilkinson のテスト行列になります (「gallery」を参照)。

A = spdiags(abs(-(n-1)/2:(n-1)/2)',0,A)

これは 三重対角になります。

B = spdiags(A)

例 3

次の例は、正方行列でない例です。

A = [11    0   13    0
      0   22    0   24
      0    0   33    0
     41    0    0   44
      0   52    0    0
      0    0   63    0
      0    0    0   74]

ここで、m =7n = 4p = 3 です。

ステートメント [B,d] = spdiags(A) は、d = [-3 0 2]' と次の行列を作成します。

B = [41   11    0
     52   22    0
     63   33   13
     74   44   24]

上記の Bd を使い、spdiags(B,d,7,4) で、元の行列 A を作成できます。

例 4

次の例は、B の列が置き換わる対角よりも大きい場合、関数 spdiags はどのようにして対角を作成するかを示したものです。

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

B =

    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

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

ans =

  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

例 5A

次の例では、以下の 3 つの条件下で構文 A = spdiags(B,d,m,n) の使用を説明します。

  • mn に等しい

  • mn より大きい

  • mn より小さい

この例で使用するコマンドは、以下のとおりです。

A = full(spdiags(B, [-2 0 2], m, n))

ここで、B は以下に示す 5 行 3 列の行列です。結果の行列 A は、mn 列の次元をもち、[-2 0 2] に非ゼロの対角要素 (-2 に下対角要素、主対角要素、2 に上対角要素) をもちます。

B =
   1    6   11
   2    7   12
   3    8   13
   4    9   14
   5   10   15

行列 B の 1 列目と 3 列目は、それぞれ A の上対角要素と下対角要素を作成に使用されます。3 つの場合すべてにおいて、B の 2 つの外側の列は、A の対角の結果より長くなります。このため、この列の一部は A に使用されます。

m == n または m > n の場合、関数 spdiags は、対応する B の列の下部から A の上対角要素を、対応する B の列の上部から A の下対角要素を取ります。

m < n の場合、関数 spdiags は、反対の処理を行います。対応する B の列の上部から A の上対角要素を、対応する B の列の下部から A の下対角要素を取ります。

パート 1 — m が n に等しい場合-  

A = full(spdiags(B, [-2 0 2], 5, 5))
 Matrix B                      Matrix A

1    6   11                 6    0   13    0    0
2    7   12                 0    7    0   14    0
3    8   13  == spdiags =>  1    0    8    0   15
4    9   14                 0    2    0    9    0
5   10   15                 0    0    3    0   10

A(3,1)A(4,2)A(5,3) は、B(:,1) の上部から取得されます。

A(1.3)A(2.4)A(3.5) は、B(:0.3) の上部から取得されます。

パート 2 — m が n より大きい場合-  

A = full(spdiags(B, [-2 0 2], 5, 4))
 Matrix B                      Matrix A

1    6   11                 6    0   13    0
2    7   12                 0    7    0   14
3    8   13  == spdiags =>  1    0    8    0
4    9   14                 0    2    0    9
5   10   15                 0    0    3    0

Part A と同じです。

パート 3 — m が n より小さい場合-  

A = full(spdiags(B, [-2 0 2], 4, 5))
 Matrix B                      Matrix A

1    6   11                 6    0   11    0    0
2    7   12                 0    7    0   12    0
3    8   13  == spdiags =>  3    0    8    0   13
4    9   14                 0    4    0    9    0
5   10   15

A(3,1)A(4,2) は、B(:,1) の下部から取得されます。

A(1.3)A(2.4)A(3.5) は、B(:0.3) の上部から取得されます。

例 5B

以下のコマンドを使用して、この例の最初のパートから対角要素を列形式で復元します。

B = spdiags(A)

各場合の元の列が復元されたことがわかります (行列 A の上と下対角要素のオーバーフローをもつ要素があることを除きます)。

パート 1-  

      Matrix A                        Matrix B

6    0   13    0    0                 1   6   0
0    7    0   14    0                 2   7   0
1    0    8    0   15  == spdiags =>  3   8  13
0    2    0    9    0                 0   9  14
0    0    3    0   10                 0  10  15

パート 2-  

    Matrix A                     Matrix B

6    0   13    0                 1   6   0
0    7    0   14                 2   7   0
1    0    8    0  == spdiags =>  3   8  13
0    2    0    9                 0   9  14
0    0    3    0

パート 3-  

      Matrix A                        Matrix B

6    0   11    0    0                 0   6  11
0    7    0   12    0                 0   7  12
3    0    8    0   13  == spdiags =>  3   8  13
0    4    0    9    0                 4   9   0

参考

|

この情報は役に立ちましたか?