このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
spdiags
非ゼロの対角を抽出してスパース帯行列またはスパース対角行列を作成
構文
説明
例
三重対角行列の作成
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 < 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
主対角の "上側" の対角は、列の "上部" から先に要素を取得します。
主対角の "下側" の対角は、列の "下部" から先に要素を取得します。
入力引数
A
— 入力行列
行列
入力行列。この行列は通常スパースですが、必ずしもスパースに限りません。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
複素数のサポート: あり
d
— 対角番号
スカラー | ベクトル
対角番号。正の整数のスカラーまたはベクトルとして指定します。対角番号は、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 番目の対角を抽出します。
Bin
— 対角要素
行列
対角要素。行列として指定します。この行列は通常非スパースですが、必ずしも非スパースに限りません。spdiags
は、Bin
の列を使用して、指定された A
の対角を置き換えます。要求する出力のサイズが m
行 n
列の場合、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
複素数のサポート: あり
m
, n
— 次元のサイズ
非負のスカラー整数
次元のサイズ。非負のスカラー整数として指定します。spdiags
は、これらの入力を使用して、作成する行列の大きさを決定します。
例: spdiags(Bin,d,300,400)
は、指定された対角 d
に沿って B
の列を配置して、300 行 400 列の行列を作成します。
出力引数
Bout
— 対角要素
行列
対角要素。非スパース行列として返されます。Bout
の列には A
から抽出した対角が含まれます。A
の外側の位置に対応する Bout
のすべての要素は、ゼロに設定されます。
id
— 対角番号
列ベクトル
対角番号。列ベクトルとして返されます。対角の番号付けの詳細については、d
を参照してください。
S
— 出力行列
行列
出力行列。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® の backgroundPool
を使用してバックグラウンドでコードを実行するか、Parallel Computing Toolbox™ の ThreadPool
を使用してコードを高速化します。
この関数はスレッドベースの環境を完全にサポートしています。詳細については、スレッドベースの環境での MATLAB 関数の実行を参照してください。
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
使用上の注意事項および制限事項:
最初の入力をスパースにすることはできません。
詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
分散配列
Parallel Computing Toolbox™ を使用して、クラスターの結合メモリ上で大きなアレイを分割します。
この関数は分散配列を完全にサポートしています。詳細については、分散配列を使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2006a より前に導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)