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
位于主对角线上方的对角线首先从列的顶部获取元素。
位于主对角线下方的对角线首先从列的底部获取元素。
输入参数
输入矩阵。此矩阵通常(但不一定)是稀疏矩阵。
数据类型: single
| double
| logical
复数支持: 是
对角线编号,指定为标量或由整数组成的向量。对角线编号遵循与 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
中提取第三条和第五条对角线。
对角线元素,指定为标量、向量或矩阵。此参量通常(但不一定)是满矩阵。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)
创建 300×400 矩阵,其中 B
的列沿指定的对角线 d
放置。
输出参量
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
spdiags
函数支持 GPU 数组输入,但有以下用法说明和限制:
第一个输入不能为稀疏。
有关详细信息,请参阅在 GPU 上运行 MATLAB 函数 (Parallel Computing Toolbox)。
此函数完全支持分布式数组。有关详细信息,请参阅使用分布式数组运行 MATLAB 函数 (Parallel Computing Toolbox)。
版本历史记录
在 R2006a 之前推出spdiags
函数的具有三个和四个输入项的语法的输出与输入更一致,如下表所示。
语法 | 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.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 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)