出个小题目:矩阵赋值
要依次一行一行赋值,因为每行都由一个函数运算出来的,所以一开始你不知道整个矩阵。比如函数如: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 编辑 ] 如果最大的维数可以事先知道,则用最大的维数.这样当然浪费内存.
不过MATLAB中还有胞元类型(cell),他用{}而不是()寻找下标.这种类型的数据形式上允许不同长度的向量放在一个cell中. 下次换个五岁的------范伟
a = ones(m,N); %%%N为足够大
for ii = 1:m,
a(ii,1:length(hanshu(ii))) =hanshu(ii);
end 原帖由 w89986581 于 2007-6-27 17:09 发表 http://www.chinavib.com/forum/images/common/back.gif
下次换个五岁的------范伟
a = ones(m,N); %%%N为足够大
for ii = 1:m,
a(ii,1:length(hanshu(ii))) =hanshu(ii);
end
用零代替就是a=zero(m,N)?
回复 #4 donkeyxu 的帖子
zeros 原帖由 w89986581 于 2007-6-27 17:09 发表 http://www.chinavib.com/forum/images/common/back.gif下次换个五岁的------范伟
a = ones(m,N); %%%N为足够大
for ii = 1:m,
a(ii,1:length(hanshu(ii))) =hanshu(ii);
end
可是还是有循环啊,能不能不用啊,我现在见到循环就害怕了 原帖由 donkeyxu 于 2007-6-27 17:17 发表 http://www.chinavib.com/forum/images/common/back.gif
可是还是有循环啊,能不能不用啊,我现在见到循环就害怕了
呵呵,那么只有把你自定义的函数变成高维运算拉,否则只能循环拉。 原帖由 w89986581 于 2007-6-27 17:20 发表 http://www.chinavib.com/forum/images/common/back.gif
呵呵,那么只有把你自定义的函数变成高维运算拉,否则只能循环拉。
a(1:ii,1:length(hanshu(ii))) =hanshu(1:ii);吗?? 用Cell命令就可以吧~ cell?怎么弄啊? 原帖由 donkeyxu 于 2007-6-27 16:37 发表 http://www.chinavib.com/forum/images/common/back.gif
要依次一行一行赋值,因为每行都由一个函数运算出来的,所以一开始你不知道整个矩阵。
比如函数如:hanshu(m);
这个函数返回一个向量,但维数不知,算出来才知道。
要得到如下矩阵:
[hanshu(1)
hanshu(2)
...
hanshu 这个函数的输入参数是什么?如果是数字,即标量,恐怕任何方法都摆脱不了循环 原帖由 donkeyxu 于 2007-6-27 17:24 发表 http://www.chinavib.com/forum/images/common/back.gif
a(1:ii,1:length(hanshu(ii))) =hanshu(1:ii);吗??
不行,我建议你先用循环做,然后在用矩阵计算. 原帖由 eight 于 2007-6-27 20:32 发表 http://www.chinavib.com/forum/images/common/back.gif
hanshu 这个函数的输入参数是什么?如果是数字,即标量,恐怕任何方法都摆脱不了循环
有道理 需要说明的是,我们一直强调向量化编程,可是强调并不意味着放弃循环,不是所有的循环都能向量化的,否则MATLAB早就废除for了。
另外我们说循环效率低,一般指的是循环里面套循环,层层套,特别是大循环里套小循环。循环效率低这一现象一般在MATLAB早期版本中比较凸现,7以后的版本中单层循环已经比以前优化很多,所以对于不得不使用循环的场合不用反射性的看到循环就害怕。
此外,楼主应该把你完整代码传上来,看看是否可以从别的角度向量化,譬如修改hanshu文件,使之功能不变。
[ 本帖最后由 rocwoods 于 2007-6-28 11:52 编辑 ] 原帖由 donkeyxu 于 2007-6-27 20:14 发表 http://www.chinavib.com/forum/images/common/back.gif
cell?怎么弄啊?
a=cell(n,m)%%m要取大点,不知道hanshu(i)的长度
for i=1:n
a(i,:)={}
end
你试试 当然还是少不了循环
页:
[1]