Matlab读取命令时是逐行读取的。所以虽然如下两个编程的结果相同,但是matlab读取命令的方式却是截然不同的: >x=ones(10000,1);
>x=x+x;
和
>x=ones(10000,1);
>for i=1:10000
> x(i)=x(i)+x(i);
>end
对于第二种情况,matlab在循环过程中,每一次都需要读取第三行。结果,matlab一种读取了20002行的编程(第一行和第二行各一次,第三行和第四行各10000次)。整个程序的运行时间一方面取决于你的编程,另一方面也跟电脑的好坏有关。我的电脑读取一行大概需要5微秒。对于第一个程序,运行需要10微秒,对于第二个程序,大概需要10万微秒。这其中的差距还是相当大的。
这也是为什么建议大家能够对数据进行向量化的时候尽可能的向量化。但是,如果你愿意用for循环的话也不是不可以。毕竟for循环看起来更容易理解。但是如果你有很多的for嵌套在一块,那程序运行的时间就会飞速的增长。
如果能把matlab的循环语句处理好,其运行速度也不会比C语言差多少。
可以测试一下自己电脑的运行速度:
>x=ones(10000,1);
>tic
>x=x+x;
>timeSpent=toc/10000
其中 tic 和 toc 可以给出这两个命令之间的程序运算需要花费多少时间。在我的电脑上,计算一次加法大概需要1.5纳秒。计算x+x的时间就是1.5纳秒的10000倍。
如果经常做这样的联系,你会发现如果所需要运行的程序较短,运行时间其实主要花费在读取命令的时间上。所以如果能够向量化,就尽量避免使用for循环。
原文作者:Jerome