永发信息网

matlab 怎么样定义一个向量或者矩阵来存储 for循环得出的函数呢? 比如A(i)=x^i? 还有什么更有效的方法?

答案:2  悬赏:20  手机版
解决时间 2021-03-07 17:58
matlab 怎么样定义一个向量或者矩阵来存储 for循环得出的函数呢? 比如A(i)=x^i? 还有什么更有效的方法?
最佳答案
1、预置(preallocation)是编写MATLAB程序比较重要的一个因素,在数组比较大的时候,是否进行预置程序运行时间相差几十倍甚至几百几千倍都很常见。所以使用
A=zero(1,n);
或者
A=zero(n,1);
进行预置通常很重要(如果n不大倒可以不做)。

2、提高MATLAB程序效率的另一个要点是向量化(Vectorization)代替显式循环。向量化表达式主要使用点运算操作符。例如,就楼主的问题而言,可以很简单的写成
A=x.^(1:n);
省略了 for 循环,对于程序效率也会有很大提升。关于点运算更详细的介绍,可以看一下参考资料的链接中我以前回答的问题。

下面的例子简单对比了两种代码的效率:
>> tic,n=100000;x=0.9;A=[];for i=1:n,b=x^i; A=[A,b];end,toc
Elapsed time is 29.920198 seconds.
>> tic,n=100000;x=0.9;B=x.^(1:n);,toc
Elapsed time is 0.020975 seconds.
>> isequal(A,B)
ans =
1

两种做法的结果相同,但时间相差了近1500倍。二者的差别主要由预置引起,向量化表达式简化了程序代码,但对于效率提升并不是非常明显。以下把n进一步加大做了对比(否则时间太短,几乎看不出差别):
>> tic,n=1000000;x=0.9;A=zeros(1,n);for i=1:n,b=x^i; A(i)=b;end,toc
Elapsed time is 0.203902 seconds.
>> tic,n=1000000;x=0.9;B=x.^(1:n);,toc
Elapsed time is 0.120953 seconds.
可见,时间相差不到一倍,但使用点运算的向量化表达式显然更简练。

3、关于另外的疑问:
(1)如果使用楼上的循环方式,A=[];是必要的,相当于对数组进行初始化。否则后面的A=[A,b];会在原来数组A基础上进一步增加元素,既花费更多瞬间,结果也不正确。
(2)A=[A,b];这是最基本的数组拼接操作(Concatenation),没有错,但属于在循环场合不推荐的做法。

希望对楼主有帮助。
全部回答
你好! A=[]; for i=1:n b=x^i; A=[A,b]; end 都存到A里了。 如果对你有帮助,望采纳。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
立邦漆刷完多久能入住
家乐福上海漕盈店地址有知道的么?有点事想过
去星巴克做兼职,有什么学历要求吗?如果说去
为什么我的侠盗猎车圣安地列斯安了cleo没有用
【仙三外传 为什么桃子要跟随南瓜呢?南瓜从茅
全国优秀小学生作文限字作文500字的编辑推荐
哪一个朝代紫砂茶具开始出现的呢
陈哥农家饭庄在什么地方啊,我要过去处理事情
承台计算时,下述说法不正确的是()。A.应分别
昆明北到昆明双龙收费站一型客车收费多少
西门子洗衣机不通电维修费大概多少
凤池,龙榜意思
我是灵活就业人员。五十岁,如果达到病退条件
估计根号10的值在哪两个连续整数之间
中国移动虞城响河街社区营业厅在什么地方啊,
推荐资讯
炖鱼怎么做好吃 家常
为什么我的魅族mx5开着数据有的应用可以上网
作文的眉批写在什么地方
下列关于砌体强度的说法不正确的是()。A.块体
无线网摄像头断电后还能用么?
魅族mx5的应用管理在哪儿
徐州恩华第三制药厂待遇、薪酬、环境怎么样?
【differently】1、differently应放在句子的
比例尺的含义
普通 乾隆通宝 市场价格多少钱 百度知道
解方程0.8x-3.4等于3.8
关于古代现代小心眼的人
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?