带状矩阵的生成
给大家一个题目: 不使用循环,如何快速生成以下带状矩阵?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 编辑 ] 我也来一个,下来想想有没有更好的。
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') 原帖由 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 编辑 ] m没问题,关键是带状条数n,n小还可以。多了按上面做就麻烦了,eight兄有简单的方法没? 原帖由 rocwoods 于 2007-5-16 20:07 发表 http://www.chinavib.com/forum/images/common/back.gif
m没问题,关键是带状条数n,n小还可以。多了按上面做就麻烦了,eight兄有简单的方法没?
嗯,不过如果 m 太大(例如 10000),申请空间也许不成功,这时候要用到稀疏矩阵存储。
n 太多的确是个问题,暂时没有想到有效的方法,呵呵 太大恐怕怎么也要用稀疏矩阵,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,:) 现在才看到大家讨论得很热闹, 那我就来个稀疏矩阵的,凑个热闹:
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]