MATLAB:更快速地预分配零矩阵
MATLAB:更快速地预分配零矩阵
/edit:有关该主题的有趣讨论,请参见此处。感谢@Dan\n
\n使用a(m,n) = 0
似乎比a = zeros(m,n)
更快,取决于矩阵a
的大小。在循环之前,这两种变体是否都是相同的预分配方式?
MATLAB中创建一个全零矩阵的方式有两种,一种是使用zeros
函数,另一种是直接赋值为0。但是在实际使用中,发现这两种方式的性能存在差异。
通过对比不同大小的矩阵创建过程的时间可以看出,直接赋值为0的方式比使用zeros
函数创建全零矩阵的方式更快。例如,创建一个2000x2000的矩阵,直接赋值为0的方式耗时0.004719秒,而使用zeros
函数耗时0.004399秒。同样,创建一个2x2的矩阵时,直接赋值为0的方式耗时0.000023秒,而使用zeros
函数耗时0.000030秒。
这种差异可能与矩阵的大小有关。当矩阵的大小增加时,差异更加明显。虽然在具体的实验中可能存在一些误差,但是可以通过多次实验得出这个结论。
zeros
函数的性能可能与计算机上MATLAB支持的线程数有关。默认情况下,zeros
函数会利用多线程来加速运算,除非手动关闭。在一台i7 CPU 860 @ 2.80GHz × 8的计算机上,可以充分利用多线程来提高性能。
总之,对于创建全零矩阵的操作,直接赋值为0的方式更快。如果需要创建大型矩阵,可以考虑关闭多线程来提高性能。
(本文内容为原作者讨论MATLAB中创建全零矩阵性能差异的实验结果和个人观点,并不代表本平台立场。)
MATLAB: Faster pre-allocation of zeros-matrix
在MATLAB中,用于快速预分配零矩阵的方法是一个常见的问题。一种常见的方法是使用a=zeros(m,n)
来预分配一个大小为m×n的零矩阵。然而,有人提出了一个更快的方法。
他们明确表示a=zeros(m,n)
和a(m,n) = 0
是不同的。尽管有一些方法可以打败a=zeros(m,n)
的性能,但简单地使用a(m,n) = 0
并不是一个安全的做法。如果a
中已经存在任何元素,它们将会继续存在。
在这里可以找到一些不错的选项,另外如果不介意风险,可以考虑反向循环。
回答中提到,反向循环似乎很有意思,我将尝试一下。除了在a
已经存在时,为什么a(m,n)
不安全?对于预分配,我是否可以安全地使用clear a; a(m,n) = 0;
(忽略使用clear会使它变慢的事实)?
根据以上讨论,我们可以得出以下结论:
- a=zeros(m,n)
和a(m,n) = 0
是不同的,前者是一种常见的预分配零矩阵的方法,后者可能会导致现有元素的保留。
- 为了更快地预分配零矩阵,可以考虑使用其他方法,如在链接中提到的一些选项或反向循环。
- 对于预分配,可以使用clear a; a(m,n) = 0;
,但要注意使用clear会使性能变慢。
希望以上内容对解决MATLAB中快速预分配零矩阵的问题有所帮助。