matble中spdiags()函数 (翻译+理解)

翻译来源      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, AB, and d are related by

for k = 1:p
    B(:,k) = diag(A,d(k))
end
A的对角是如何在向量d中列出的

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矩阵行>列时,下对角逆序;上对角顺序





评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值