spdiags
非ゼロの対角を抽出してスパース帯行列またはスパース対角行列を作成
構文
説明
例
三重対角行列を作成し、その行列の対角の一部を変更してから対角を抽出します。
1 行 3 列の対角要素のベクトルを使用して 9 行 9 列の三重対角行列を作成します。行列の要素を表示します。
n = 9; A = spdiags([1 -2 1],-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)
Bout = 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 < n
の m
行 n
列の行列の場合、規則は次のとおりです。
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
が対角を打ち切る方法は、m
行 n
列の行列 A
のサイズに依存します。 の場合の動作を上図に示します。
主対角の "下側" の対角は、列の "上部" から先に要素を取得します。
主対角の "上側" の対角は、列の "下部" から先に要素を取得します。
の場合、この動作が逆になります。
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
| logical
複素数のサポート: あり
対角番号。整数のスカラーまたはベクトルとして指定します。対角番号は、diag
と同じ規則に従います。
d < 0
は主対角の下側であり、かつd >= -(m-1)
を満たす。d = 0
は主対角。d > 0
は主対角の上側であり、かつd <= (n-1)
を満たす。
m
行 n
列の行列 A
には (m + n - 1)
個の対角があります。これらの対角は、-(m-1)
~ (n-1)
のインデックスを使用して、ベクトル d
で指定します。たとえば、A
が 5 行 6 列の場合、10 個の対角をもち、これらは、-4、-3、...4、5 のインデックスでベクトル d
に指定されます。次の図は、この対角の番号付けを示します。
A
の外側の対角 (上の例の d = 7
など) を指定すると、spdiags
は、要素をすべてゼロとしてその対角を返します。
例: spdiags(A,[3 5])
は、A
から 3 番目と 5 番目の対角を抽出します。
対角要素。スカラー、ベクトル、または行列として指定します。この引数は通常非スパースですが、必ずしも非スパースに限りません。spdiags
は、Bin
の列を使用して、指定された A
の対角を置き換えます。要求する出力のサイズが m
行 n
列で、Bin
が列ベクトルまたは行列の場合、Bin
は少なくとも min(m,n)
行でなければなりません。
構文 S = spdiags(Bin,d,m,n)
で、Bin
の列の要素数が置き換える元の対角より多く、かつ m >= n
の場合、spdiags
は、Bin
の列の "下部" から上対角要素を取得し、Bin
の列の "上部" から下対角要素を取得します。ただし、m < n
の場合、上対角要素は Bin
の列の "上部" からになり、下対角要素は "下部" からになります。この動作の例については、サイズの異なる列と対角を参照してください。
データ型: single
| double
| 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
で指定した対角に沿って配置することで、m
行n
列のスパース行列S
が作成されます。
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
この関数はスレッドベースの環境を完全にサポートしています。詳細については、スレッドベースの環境での MATLAB 関数の実行を参照してください。
spdiags
関数は GPU 配列入力をサポートしますが、次の使用上の注意および制限があります。
最初の入力をスパースにすることはできません。
詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
この関数は分散配列を完全にサポートしています。詳細については、分散配列を使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2006a より前に導入spdiags
関数の 3 入力の構文と 4 入力の構文で、次の表に示すように、出力が入力とより整合したものになりました。
構文 | R2024b 以前の出力型 | R2025a 以降の出力型 |
---|---|---|
S = spdiags(Bin,d,A) |
| A と同じ |
S = spdiags(Bin,d,m,n) |
| Bin と同じ |
spdiags
では、入力引数 Bin
の暗黙的な拡張がサポートされます。対角要素をスカラー、ベクトル、または行列として指定でき、スカラーまたはベクトルを指定した場合は関数によって値が拡張されます。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)