eight 发表于 2007-5-16 16:52

带状矩阵的生成

给大家一个题目: 不使用循环,如何快速生成以下带状矩阵?
D =
   0   0   0   0   1   2   3
   0   0   0   1   2   3   0
   0   0   1   2   3   0   0
   0   1   2   3   0   0   0
   1   2   3   0   0   0   0

我先献丑了:
C = diag(repmat(3,1,5));
C = ;
B = diag(repmat(2,1,5), 1);
B(end,:) = [];
B = ;
A = diag(repmat(1,1,5), 2);
A(end-1:end,:) = [];
D = A+B+C;
D = fliplr(D);注:我对 matlab 的函数掌握得不太好,也用得不够灵活,可能把问题复杂化了,也许一、两个命令就可以达到目的,还请其他高手赐教

[ 本帖最后由 eight 于 2007-5-16 19:42 编辑 ]

rocwoods 发表于 2007-5-16 17:34

我也来一个,下来想想有没有更好的。
A=zeros(7,5);
A((1:7:29)+(0:4))=1;
A((2:7:30)+(0:4))=2;
A((3:7:31)+(0:4))=3;
A=flipud(A')

eight 发表于 2007-5-16 19:43

原帖由 rocwoods 于 2007-5-16 17:34 发表 http://www.chinavib.com/forum/images/common/back.gif
我也来一个,下来想想有没有更好的。
A=zeros(7,5);
A((1:7:29)+(0:4))=1;
A((2:7:30)+(0:4))=2;
A((3:7:31)+(0:4))=3;
A=flipud(A')


我的意思是,矩阵的大小是可变的(m*(m+2)),但是带状有n(n <= m/2)条,第一行最后n个元素非0,最后一行前n个元素非0

[ 本帖最后由 eight 于 2007-5-16 19:49 编辑 ]

rocwoods 发表于 2007-5-16 20:07

m没问题,关键是带状条数n,n小还可以。多了按上面做就麻烦了,eight兄有简单的方法没?

eight 发表于 2007-5-16 20:15

原帖由 rocwoods 于 2007-5-16 20:07 发表 http://www.chinavib.com/forum/images/common/back.gif
m没问题,关键是带状条数n,n小还可以。多了按上面做就麻烦了,eight兄有简单的方法没?

嗯,不过如果 m 太大(例如 10000),申请空间也许不成功,这时候要用到稀疏矩阵存储。

n 太多的确是个问题,暂时没有想到有效的方法,呵呵

bainhome 发表于 2007-5-16 21:23

太大恐怕怎么也要用稀疏矩阵,1万维可能写个mex更好。
A=fliplr(diag(2*ones(1,7))+diag(ones(1,6),1)+3*diag(ones(1,6),-1));
A=A(2:end-1,:)

xjzuo 发表于 2007-5-17 08:36

现在才看到大家讨论得很热闹, 那我就来个稀疏矩阵的,凑个热闹:
A=fliplr(sparse(1:5,1:5,3*ones(1,5),5,7)+sparse(1:5,2:6,2*ones(1,5),5,7)+sparse(1:5,3:7,ones(1,5),5,7));
full(A)% 查看
页: [1]
查看完整版本: 带状矩阵的生成