从 m×n 矩阵 A 中提取非零对角线,并将其作为 min(m,n)×p 矩阵 Bout 中的列返回,其中 p 是非零对角线的数目。
A: m行n列的矩阵,非零元素位于对角线上
Bout: min(m,n)行p列的矩阵,p为矩阵A非零对角线条数,p列对应A矩阵的p个非零对角线上的元素
id: 长度为p的向量,记录每一条非零对角线对应的标号
行数>=列数时,对角线左右边界对齐
行数<列数时,对角线上下边界对齐
一、提取非零对角线
对角线对齐,缺少的地方补零
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 = spdiags(A)
Bout =
0 0 5 10
0 0 6 11
0 3 7 12
1 4 8 0
2 5 9 0
>> [Bout,id] = spdiags(A)
Bout =
0 0 5 10
0 0 6 11
0 3 7 12
1 4 8 0
2 5 9 0
id =
-3
-2
1
3
>> d = [-2 1 3];
>> Bout = spdiags(A,d)
Bout =
0 5 10
0 6 11
3 7 12
4 8 0
5 9 0
二、给定对角线还原矩阵
Bin =
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(Bin,d,6,6)
A =
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
行数<列数时,对角线上下边界对齐,多余的部分切掉
>> A = spdiags(Bin,d,5,6)
A =
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中d指定的对角线替换为Bin中对应的列
A =
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
>> Bin = [4;3;2;1;0;1;2;3;4];
>> d = 0;
>> A = spdiags(Bin,d,A)
A =
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
转载请注明出处,谢谢!