零功能的目的是什么?

6视图(30天)
阿布Zar
阿布Zar 2023年2月23日
评论道: dpb 2023年2月24日
为什么零功能介绍吗?
谢谢你!

接受的答案

史蒂文的主
史蒂文的主 2023年2月23日
0 函数来使用 preallocate 数组。而不是必须找到一个新的块的内存来存储结果,将现有元素复制到新的块的内存每次添加一个新元素的数组循环,我们分配一块内存足够容纳所有我们想要添加的元素内部的循环和填补它在循环。
3评论
dpb
dpb 2023年2月24日
+ 1:)很好的类比,史蒂文……

登录置评。

更多的答案(2)

约翰D 'Errico
约翰D 'Errico 2023年2月23日
考虑这两个代码:
抽搐
x = [];
i = 1∶
x = [x,我);
结束
toc
运行时间是1.538085秒。
清晰的x
抽搐
x = 0 (100000);
i = 1∶
x (i) = =我;
结束
toc
运行时间是0.009933秒。
你看见这两个编码产生向量1∶?
为什么是第一个代码这么多慢?发生在第一个?MATLAB被迫分配,然后按顺序重新分配每个通过循环新数组,然后完全将整个数组复制到一个新的位置。这个过程变得越来越长,每个通过循环。
关键是,你preallocate这样一个数组来最终尺寸,在循环之前。

dpb
dpb 2023年2月23日
编辑:dpb 2023年2月23日
函数CoherentState = CoherentStatefunc(α,昏暗的)
CoherentState = 0(暗,1);
n = 0 (DIM-1):
CoherentState(挂(n), 1) =权力(α,n) * exp (abs(α)* abs(α)/ 2)/√(阶乘(n));
结束
结束
preallocate输出数组 CoherentState 的一次填充一个元素 为结束…… 循环。
注意:
除非 挂() 是一个函数,该函数将会失败,因为间接寻址矢量不会被定义在函数,如果它是一个矢量,试图解决它零指数也会错误。“MATLAB不是C”
权力(α,n) 也必须是一个函数。
就好像上面的函数在真正的MATLAB可以写简单的风格
函数CoherentState = CoherentStatefunc(α,昏暗的)
n = [0: (DIM-1)]。';
CoherentState(挂(n)) =权力(α,n) * exp (abs(α)* abs(α)/ 2)。/√(阶乘(n));
结束
如果两个其他功能也被写入处理向量输入。
至于细节“为什么”preallocating看是很重要的 < preallocating-arrays > 在文档中……
2的评论
dpb
dpb 2023年2月24日
“…为什么这里介绍的两个函数挂和权力在这个函数中,“
纯粹的选择代码的作者在如何选择因素。
使用函数的主要原因是一段相对较短的代码是什么,结果是需要在应用程序中不止一次有速记参考它简化了更高级别的代码。
这是特别重要的/有用的如果有需要更改的结果,如果上面的散落在代码中,必须能够确保一个发现和固定每一个实例;的功能,只有在一个地方更改将自动反映无处不在。
这是一个通用的原因;另一个特定的代码是,如上所述,函数的编写方式是指示性的相对缺乏经验的MATLAB编码器有写它,他们有足够的经验知道preallocate分配一个数组中的元素时,但还不够“年级”认识到,没有必要为循环构造;可以使用MATLAB的内部矢量化操作,从而得到益处的任务。
如果作者不需要认识到,结果但在孤独的位置,调用这个函数,那么不妨被写成一行在调用程序相反,是的。
我们不知道整个代码结构能够回答是否不同的分解可能是更好的只有孤立的一个例程。

登录置评。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!