我需要帮助确定实验中矩阵nxn的行列式的计算复杂性
我的代码:
import numpy as np
import timeit
t0 = time.time()
for n in range(1, 10):
A = np.random.rand(n, n)
det = np.linalg.slogdet(A)
t = timeit.timeit(lambda: det)
print(t)
但是我得到了每个n的相同时间,因此计算复杂度:O(N)不正确,因为它意味着是O(N ^ 3).任何帮助将非常感激.
解决方法:
对于它的价值,任何有意义的基准测试通常需要足够大的N来给计算机一些东西来咀嚼. 10×10矩阵不足以开始看到复杂性.开始抛出100,1000,10000等数字,然后你会看到你的缩放.
例如,如果我稍微修改您的代码
for n in range(1, 14):
t0 = time.time()
p = 2**n
A = np.random.rand(p,p)
det = np.linalg.slogdet(A)
print('N={:04d} : {:.2e}s'.format(p, time.time() - t0))
这导致了
N=0002 : 4.35e-02s
N=0004 : 0.00e+00s
N=0008 : 0.00e+00s
N=0016 : 5.02e-04s
N=0032 : 0.00e+00s
N=0064 : 5.02e-04s
N=0128 : 5.01e-04s
N=0256 : 1.50e-03s
N=0512 : 8.00e-03s
N=1024 : 3.95e-02s
N=2048 : 2.05e-01s
N=4096 : 1.01e+00s
N=8192 : 7.14e+00s
您可以看到,对于非常小的N值,一些小值优化和技巧使得很难看到O()复杂度,但随着N值的增长,您可以开始看到缩放.