翻译来源 matble中的help spdiags
转载请注明出处https://blog.csdn.net/zhmjunjun/article/details/79790957 谢谢
spdiags函数推广了斜对角函数的应用,可以进行四种不同的操作,如下:
B = spdiags(A)
从m-by-n矩阵A中提取所有非零对角。B是一个min(m,n)-by-p矩阵,其列是A矩阵的p非零对角
[B,d] = spdiags(A)
返回长度为p的向量d,其整数部分对应A中的对角线(非零对角元素)。
B = spdiags(A,d)
提取d指定的对角线。
A = spdiags(B,d,A)
将d指定的对角线替换为B列,输出是稀疏的。
A = spdiags(B,d,m,n)
通过获取B的列并将它们放置在d指定的对角线上,创建一个m-by-n稀疏矩阵。.
A: m-by-n矩阵,通常(但不一定)稀疏,其非零或指定元素位于p对角上.
B: 最小(m,n)-by-p矩阵,p为矩阵A非零斜对角线条数。
d: 长度为p的向量,是每一条非零斜对角线对应的计数标,,所以向量d的长度为p,因为矩阵A有p条非零斜对角。
Roughly, A
, B
, and d
are related by
for k = 1:p B(:,k) = diag(A,d(k)) end
m-by-n 的矩阵A具有m+n-1个对角.它们是在向量d中使用从-m+1到n-1的索引指定的。
A为5X6的矩阵,矩阵A对应10个对角,分别用-4,-3,……,4,5标记。
如下图:
实例列举帮助理解——————————————————————————————————
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]
[B, d] =spdiags(A)
%%min(size(A))=5; 因此5为B矩阵的列,非零斜对角为B矩阵的行,
%%因为size(A)将输出矩阵A的 行 与 列,这里分别是5 与 6。 因此 min(size(A))=5
第一个输出B的列包含A的非零对角,第二个输出d列出A的非零对角的索引,如下图所示
请注意,A中最长的非零对角线包含在B的第3列中,A的其他非零对角线在B中相应的列中添加了额外的零,使B的所有列都具有相同的长度。对于A的主对角线以下的非零对角线,在列的顶部加上额外的零。对于A的主对角线以上的非零对角线,在列的底部加上额外的零。下图说明了这一点。
例二:此示例生成n点上经典的第二差分算子的稀疏三对角表示。(这个例子不好看出相互关系,但下一个例子可以看出一些)
e = ones(n,1);
A = spdiags([e -2*e e], -1:1, n, n)
%Turn it into Wilkinson's test matrix (see gallery):
A = spdiags(abs(-(n-1)/2:(n-1)/2)',0,A)
%Finally, recover the three diagonals:
B = spdiags(A)
运行代码时,将n具体化
例三
A = [11 0 13 0
0 22 0 24
0 0 33 0
41 0 0 44
0 52 0 0
0 0 63 0
0 0 0 74]
% Here m =7, n = 4, and p = 3. p为非零斜对角线条数
[B,d] = spdiags(A)
d = [-3 0 2]'
B = [41 11 0
52 22 0
63 33 13
74 44 24]
相反,对于上面的B和d,表达式spdiags(B,d,7,4)复制了原始的A。
为什么是7,4?因为想要还原的 原始矩阵A(为4X7的矩阵)
>> spdiags(B,d,7,4)
% d是对应的非零斜对角的位置; 7,4.为构建一个列为7,行为4的矩阵,除了将矩阵B的元素,按照d非零斜对角线的位置还原,其余都填补0;
% 结果为,这些正好对应于原始矩阵A的相应位置,按A矩阵的列表示。(因为A矩阵正好是列为7,行为4的矩阵)
ans =
(1,1) 11
(4,1) 41
(2,2) 22
(5,2) 52
(1,3) 13
(3,3) 33
(6,3) 63
(2,4) 24
(4,4) 44
(7,4) 74
例四 此示例演示了当B列 比要替换的对角线长时;spdiags如何创建对角线。(方法一样,就是将多余部分删除,负数顺序,正数倒序录入,,自己画一下就一下子理解了) ,repmat(A,n,m)函数主要功能是,矩阵块的复制。将矩阵A当做块,填充矩阵nXm。 具体可以在matble中,输入: help repmat
B = repmat((1:6)',[1 7])
B =
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(B,d,6,6);
full(A)
ans =
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(B,d,n,m)的所以转化情况都给出了,
当A矩阵行<=列时,下对角顺序;上对角逆序
当A矩阵行>列时,下对角逆序;上对角顺序
三个图例将 B = spdiags(A) 的所有情况表示出来
当A矩阵行<=列时,下对角顺序;上对角逆序
当A矩阵行>列时,下对角逆序;上对角顺序