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];
从该矩阵中提取非零对角线。指定两个输出以返回对角线编号。
[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
第一个输出 Bout
的列包含 A
的非零对角线。第二个输出 d
列出 A
的非零对角线的索引。A
中最长的非零对角线在 Bout
的第 3 列中。为了使 Bout
的所有列具有相同长度,A
的其他非零对角线在 Bout
中的对应列会用额外的零补足。对于 m < n
的 m
×n
矩阵,规则如下:
对于位于
A
的主对角线下方的非零对角线,在列的顶部添加额外零(如Bout
的前两列中)。对于位于
A
的主对角线上方的非零对角线,在列的底部添加额外零(如Bout
的最后一列中)。
即使在 Bout
中未返回最长的对角线,spdiags
仍会以这种方式用零填充 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
提取主对角线及位于它上方和下方的第一条对角线。
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
尝试提取第五个上对角线 (d = 5
)。由于 A
只有四条上对角线,因此 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
创建 6×6 方阵,以 Bin
的几个列为对角线。由于有些对角线只有一个或两个元素,因此 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
中的每列都有六个元素,但 A
中只有主对角线有六个元素。因此,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)
条对角线。可在向量 d
中使用从 -(m-1)
到 (n-1)
的索引指定这些对角线。例如,如果 A
为 5×6 矩阵,则它有 10 条对角线,并使用索引 –4、–3、…、4、5 等在向量 d
中指定它们。下图说明这种对角线编号。
如果您指定位于 A
之外的对角线(如上面示例中的 d = 7
),则 spdiags
以全零形式返回该对角线。
示例: spdiags(A,[3 5])
从 A
中提取第三条和第五条对角线。
Bin
— 对角线元素
标量 | 向量 | 矩阵
对角线元素,指定为标量、向量或矩阵。此参量通常(但不一定)是满矩阵。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
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
复数支持: 是
m
, n
— 维度大小
非负整数标量
维度大小,指定为非负整数标量。spdiags
使用这些输入来确定要创建多大的矩阵。
示例: spdiags(Bin,d,300,400)
创建 300×400 矩阵,其中 B
的列沿指定的对角线 d
放置。
输出参量
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
GPU 数组
通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
分布式数组
使用 Parallel Computing Toolbox™ 在集群的组合内存中对大型数组进行分区。
此函数完全支持分布式数组。有关详细信息,请参阅Run MATLAB Functions with Distributed Arrays (Parallel Computing Toolbox)。
版本历史记录
在 R2006a 之前推出R2024a: 将对角线元素指定为标量、向量或矩阵
spdiags
支持输入参量 Bin
的隐式扩展。您可以将对角线元素指定为标量、向量或矩阵,如果您指定标量或向量,函数会扩展这些值。
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)