donkeyxu 发表于 2007-6-27 16:37

出个小题目:矩阵赋值

要依次一行一行赋值,因为每行都由一个函数运算出来的,所以一开始你不知道整个矩阵。
比如函数如: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 编辑 ]

VibrationMaster 发表于 2007-6-27 17:06

如果最大的维数可以事先知道,则用最大的维数.这样当然浪费内存.
不过MATLAB中还有胞元类型(cell),他用{}而不是()寻找下标.这种类型的数据形式上允许不同长度的向量放在一个cell中.

w89986581 发表于 2007-6-27 17:09

下次换个五岁的------范伟
a = ones(m,N);   %%%N为足够大
for ii = 1:m,
   a(ii,1:length(hanshu(ii))) =hanshu(ii);
end

donkeyxu 发表于 2007-6-27 17:12

原帖由 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)?

w89986581 发表于 2007-6-27 17:13

回复 #4 donkeyxu 的帖子

zeros

donkeyxu 发表于 2007-6-27 17:17

原帖由 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


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

w89986581 发表于 2007-6-27 17:20

原帖由 donkeyxu 于 2007-6-27 17:17 发表 http://www.chinavib.com/forum/images/common/back.gif



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

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

donkeyxu 发表于 2007-6-27 17:24

原帖由 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);吗??

lxq 发表于 2007-6-27 20:04

用Cell命令就可以吧~

donkeyxu 发表于 2007-6-27 20:14

cell?怎么弄啊?

eight 发表于 2007-6-27 20:32

原帖由 donkeyxu 于 2007-6-27 16:37 发表 http://www.chinavib.com/forum/images/common/back.gif
要依次一行一行赋值,因为每行都由一个函数运算出来的,所以一开始你不知道整个矩阵。
比如函数如:hanshu(m);
这个函数返回一个向量,但维数不知,算出来才知道。
要得到如下矩阵:
[hanshu(1)
hanshu(2)
...

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

w89986581 发表于 2007-6-27 20:37

原帖由 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);吗??



不行,我建议你先用循环做,然后在用矩阵计算.

donkeyxu 发表于 2007-6-27 20:40

原帖由 eight 于 2007-6-27 20:32 发表 http://www.chinavib.com/forum/images/common/back.gif


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


有道理

rocwoods 发表于 2007-6-28 09:39

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

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

lxq 发表于 2007-6-28 10:48

原帖由 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]
查看完整版本: 出个小题目:矩阵赋值