声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4463|回复: 6

[编程技巧] 带状矩阵的生成

[复制链接]
发表于 2007-5-16 16:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
给大家一个题目: 不使用循环,如何快速生成以下带状矩阵?
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

我先献丑了:

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

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

评分

1

查看全部评分

回复
分享到:

使用道具 举报

发表于 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')

评分

1

查看全部评分

 楼主| 发表于 2007-5-16 19:43 | 显示全部楼层



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

[ 本帖最后由 eight 于 2007-5-16 19:49 编辑 ]
发表于 2007-5-16 20:07 | 显示全部楼层
m没问题,关键是带状条数n,n小还可以。多了按上面做就麻烦了,eight兄有简单的方法没?
 楼主| 发表于 2007-5-16 20:15 | 显示全部楼层
原帖由 rocwoods 于 2007-5-16 20:07 发表
m没问题,关键是带状条数n,n小还可以。多了按上面做就麻烦了,eight兄有简单的方法没?


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

n 太多的确是个问题,暂时没有想到有效的方法,呵呵
发表于 2007-5-16 21:23 | 显示全部楼层
太大恐怕怎么也要用稀疏矩阵,1万维可能写个mex更好。
  1. A=fliplr(diag(2*ones(1,7))+diag(ones(1,6),1)+3*diag(ones(1,6),-1));
  2. A=A(2:end-1,:)
复制代码

评分

1

查看全部评分

发表于 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

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-12 20:30 , Processed in 0.057804 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表