skyismine 发表于 2008-12-18 10:36

块对角矩阵

想请教个问题。
块对角矩阵的形成,可以用blkdiag,这个函数生成的块对角矩阵是没有重叠的,现在我要生成一个有重叠的块对角矩阵。做个举例以说明问题。A为30×30的矩阵,现在要生成50×50的矩阵B,B为带状矩阵,B(1:20,1:20)=A(1:20,1:20),B(31:50,31:50)=A(31:50,31:50),而B(21:30,21:30)=2×A(21:30,21:30); 即B(21:30,21:30)为重叠的部分。
这样表述问题应该说清楚问题了吧,当然,我遇到的不是仅仅两个A形成,比如任意个A(30×30),重叠部分是10×10,由n个A形成的矩阵就是(2×n+1)×10了。
请高手帮忙解答下。谢谢

sogooda 发表于 2008-12-18 15:35

楼主的意思是这样吗?
A为30×30的矩阵,现在要生成50×50的矩阵B
B(1:20,1:20)=A(1:20,1:20)
B(31:50,31:50)=A(21:30,21:30)
B(21:30,21:30)=A(21:30,21:30)+A(1:10,1:10)

ChaChing 发表于 2008-12-18 19:20

回复 楼主 skyismine 的帖子

找了下! 好像没现成的函数!?
我想使用loop应该就可以了

sogooda 发表于 2008-12-18 22:41

回复 板凳 ChaChing 的帖子

仔细想了一下,楼主的意思和公式表达是不符的。如果使用A(1:20,1:20)和A(21:30,21:30)赋值的话,A(21:30,1:20)和A(1:20,21:30)就被忽略掉了。在没找到合适的函数的情况下,我想下面的循环应该是可用的。
clear;clc
m=30;
mm=10;
n=8;

A=randn(m);
B=zeros((m-mm)*(n-1)+m);
B(1:m,1:m)=A;
for i=1:n-1
    B(i*(m-mm)+1:i*(m-mm)+30,i*(m-mm)+1:i*(m-mm)+30)=A+B(i*(m-mm)+1:i*(m-mm)+30,i*(m-mm)+1:i*(m-mm)+30);
end
spy(B)


[ 本帖最后由 sogooda 于 2008-12-18 22:48 编辑 ]

ChaChing 发表于 2008-12-19 00:50

回复 地板 sogooda 的帖子

我的意思同你! 我想楼主可能不小心表达错了! 本来亦想帮忙写, 但有点懒得programing! 没动力?
你起头, 我稍修改下, 我比较习惯喜欢这个样, 参考下!
使用ones好检查程序有无错, 重覆的使用变数容易看, 我想你亦应该如此, 可能太赶忽略!

m=30; mm=10; n=8;
A=ones(m); B=zeros((m-mm)*(n-1)+m); B(1:m,1:m)=A;
for i=1:n-1
   pp=i*(m-mm)+1:i*(m-mm)+30; B(pp,pp)=A+B(pp,pp);
end
spy(B)

[ 本帖最后由 ChaChing 于 2008-12-19 01:12 编辑 ]

ChaChing 发表于 2008-12-19 01:13

回复 楼主 skyismine 的帖子

为何有此需求? 方便分享?

skyismine 发表于 2008-12-19 12:00

感谢各位的热情解答,我后来也编出来了,我的初衷是想避开循环,通过矩阵的移动等操作实现,因为循环会影响速度。还是要感谢各位。:@)

ch_j1985 发表于 2008-12-19 21:13

回复 7楼 skyismine 的帖子

方法可否分享一下?
页: [1]
查看完整版本: 块对角矩阵