MATLAB:更快速地预分配零矩阵

10 浏览
0 Comments

MATLAB:更快速地预分配零矩阵

/edit:有关该主题的有趣讨论,请参见此处。感谢@Dan\n


\n使用a(m,n) = 0似乎比a = zeros(m,n)更快,取决于矩阵a的大小。在循环之前,这两种变体是否都是相同的预分配方式?

0
0 Comments

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中创建全零矩阵性能差异的实验结果和个人观点,并不代表本平台立场。)

0
0 Comments

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中快速预分配零矩阵的问题有所帮助。

0