声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2594|回复: 14

[编程技巧] 出个小题目:矩阵赋值

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

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

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

x
要依次一行一行赋值,因为每行都由一个函数运算出来的,所以一开始你不知道整个矩阵。
比如函数如:hanshu(m);
这个函数返回一个向量,但维数不知,算出来才知道。
要得到如下矩阵:
[hanshu(1)
hanshu(2)
hanshu(3)
hanshu(4)]
每行列数不够的用0代替,请问如何做到,不要用如下的循环:
for n=1:4
     t=hanshu(n);
     m=length(t)
     for k=1:m
         a(n, k)=t(k)
     end
end

[ 本帖最后由 eight 于 2007-6-27 20:33 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-6-27 17:06 | 显示全部楼层
如果最大的维数可以事先知道,则用最大的维数.这样当然浪费内存.
不过MATLAB中还有胞元类型(cell),他用{}而不是()寻找下标.这种类型的数据形式上允许不同长度的向量放在一个cell中.
发表于 2007-6-27 17:09 | 显示全部楼层
下次换个五岁的------范伟
a = ones(m,N);   %%%N为足够大
for ii = 1:m,
   a(ii,1:length(hanshu(ii))) =  hanshu(ii);
end
 楼主| 发表于 2007-6-27 17:12 | 显示全部楼层


用零代替就是a=zero(m,N)?
发表于 2007-6-27 17:13 | 显示全部楼层

回复 #4 donkeyxu 的帖子

zeros
 楼主| 发表于 2007-6-27 17:17 | 显示全部楼层
原帖由 w89986581 于 2007-6-27 17:09 发表
下次换个五岁的------范伟
a = ones(m,N);   %%%N为足够大
for ii = 1:m,
   a(ii,1:length(hanshu(ii))) =  hanshu(ii);
end



可是还是有循环啊,能不能不用啊,我现在见到循环就害怕了
发表于 2007-6-27 17:20 | 显示全部楼层
原帖由 donkeyxu 于 2007-6-27 17:17 发表



可是还是有循环啊,能不能不用啊,我现在见到循环就害怕了


呵呵,那么只有把你自定义的函数变成高维运算拉,否则只能循环拉。
 楼主| 发表于 2007-6-27 17:24 | 显示全部楼层
原帖由 w89986581 于 2007-6-27 17:20 发表


呵呵,那么只有把你自定义的函数变成高维运算拉,否则只能循环拉。



a(1:ii,1:length(hanshu(ii))) =  hanshu(1:ii);吗??
发表于 2007-6-27 20:04 | 显示全部楼层
用Cell命令就可以吧~
 楼主| 发表于 2007-6-27 20:14 | 显示全部楼层
cell?怎么弄啊?
发表于 2007-6-27 20:32 | 显示全部楼层
原帖由 donkeyxu 于 2007-6-27 16:37 发表
要依次一行一行赋值,因为每行都由一个函数运算出来的,所以一开始你不知道整个矩阵。
比如函数如:hanshu(m);
这个函数返回一个向量,但维数不知,算出来才知道。
要得到如下矩阵:
[hanshu(1)
hanshu(2)
...


hanshu 这个函数的输入参数是什么?如果是数字,即标量,恐怕任何方法都摆脱不了循环
发表于 2007-6-27 20:37 | 显示全部楼层
原帖由 donkeyxu 于 2007-6-27 17:24 发表



a(1:ii,1:length(hanshu(ii))) =  hanshu(1:ii);吗??




不行,我建议你先用循环做,然后在用矩阵计算.
 楼主| 发表于 2007-6-27 20:40 | 显示全部楼层
原帖由 eight 于 2007-6-27 20:32 发表


hanshu 这个函数的输入参数是什么?如果是数字,即标量,恐怕任何方法都摆脱不了循环



有道理
发表于 2007-6-28 09:39 | 显示全部楼层
需要说明的是,我们一直强调向量化编程,可是强调并不意味着放弃循环,不是所有的循环都能向量化的,否则MATLAB早就废除for了。
另外我们说循环效率低,一般指的是循环里面套循环,层层套,特别是大循环里套小循环。循环效率低这一现象一般在MATLAB早期版本中比较凸现,7以后的版本中单层循环已经比以前优化很多,所以对于不得不使用循环的场合不用反射性的看到循环就害怕。
此外,楼主应该把你完整代码传上来,看看是否可以从别的角度向量化,譬如修改hanshu文件,使之功能不变。

[ 本帖最后由 rocwoods 于 2007-6-28 11:52 编辑 ]

评分

2

查看全部评分

发表于 2007-6-28 10:48 | 显示全部楼层
原帖由 donkeyxu 于 2007-6-27 20:14 发表
cell?怎么弄啊?



a=cell(n,m)  %%m要取大点,不知道hanshu(i)的长度
for i=1:n
a(i,:)={[hanshu(i)]}
end

你试试 当然还是少不了循环
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-12-12 12:50 , Processed in 0.067751 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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