第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 scipy.linalg.LU 反復(fù)求解 Ax = b 如此慢?

為什么 scipy.linalg.LU 反復(fù)求解 Ax = b 如此慢?

慕碼人2483693 2023-12-12 20:33:53
傳統(tǒng)觀點認(rèn)為,如果您使用相同的 A 和不同的 b 多次求解 Ax = b,則應(yīng)該對 LU 使用 LU 因式分解。p, l, u = scipy.linalg.lu(A)如果我在循環(huán)中多次使用和求解x = scipy.linalg.solve(l, p.T@b) x = scipy.linalg.solve(u, x)這最終比僅僅使用慢得多x = scipy.linalg.solve(A,b)在循環(huán)。是否scipy.linalg.solve()沒有優(yōu)化使用前向和后向替換來求解上對角線和下對角線系統(tǒng)?或者,是否有可能存在一些編譯技巧,讓 python 認(rèn)識到它可以對該scipy.linalg.solve部分進行 LU 分解?我知道 scipy 中有l(wèi)inalg.lu_factor 一些linalg.lu_solve例程,但我想遠離這些例程,因為這應(yīng)該是一個教學(xué)示例。
查看完整描述

1 回答

?
小唯快跑啊

TA貢獻1863條經(jīng)驗 獲得超2個贊

我的大部分線性代數(shù)研究都是在計算機之前(或者至少在 MATLAB/python 之前)。但我可以閱讀文檔。


In [29]: from scipy import linalg as la

從以下示例數(shù)組開始la.lu:


In [30]: A = np.array([[2, 5, 8, 7], [5, 2, 2, 8], [7, 5, 6, 6], [5, 4, 4, 8]])

In [31]: p, l, u = la.lu(A)

In [32]: p

Out[32]:?

array([[0., 1., 0., 0.],

? ? ? ?[0., 0., 0., 1.],

? ? ? ?[1., 0., 0., 0.],

? ? ? ?[0., 0., 1., 0.]])

In [33]: l

Out[33]:?

array([[ 1.? ? ? ? ,? 0.? ? ? ? ,? 0.? ? ? ? ,? 0.? ? ? ? ],

? ? ? ?[ 0.28571429,? 1.? ? ? ? ,? 0.? ? ? ? ,? 0.? ? ? ? ],

? ? ? ?[ 0.71428571,? 0.12? ? ? ,? 1.? ? ? ? ,? 0.? ? ? ? ],

? ? ? ?[ 0.71428571, -0.44? ? ? , -0.46153846,? 1.? ? ? ? ]])

In [34]: u

Out[34]:?

array([[ 7.? ? ? ? ,? 5.? ? ? ? ,? 6.? ? ? ? ,? 6.? ? ? ? ],

? ? ? ?[ 0.? ? ? ? ,? 3.57142857,? 6.28571429,? 5.28571429],

? ? ? ?[ 0.? ? ? ? ,? 0.? ? ? ? , -1.04? ? ? ,? 3.08? ? ? ],

? ? ? ?[ 0.? ? ? ? ,? 0.? ? ? ? ,? 0.? ? ? ? ,? 7.46153846]])


In [42]: b=np.arange(4)

In [43]: la.solve(A,b)

Out[43]: array([-0.21649485,? 2.54639175, -1.54639175,? 0.01030928])

In [44]: timeit la.solve(A,b)

43.5 μs ± 88.5 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

我看到la.solve_triangular. 經(jīng)過一番嘗試和錯誤后我得到:


In [46]: la.solve_triangular(u,la.solve_triangular(l,p.T@b, lower=True))

Out[46]: array([-0.21649485,? 2.54639175, -1.54639175,? 0.01030928])

并計時:


In [47]: timeit la.solve_triangular(u,la.solve_triangular(l,p.T@b, lower=True))

83 μs ± 2.6 μs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

因此,雙重使用solve_trianglar比 1 慢solve,但比使用solve不知道其數(shù)組是三角形的 a 更快。


In [48]: la.solve(u,la.solve(l,p.T@b))

Out[48]: array([-0.21649485,? 2.54639175, -1.54639175,? 0.01030928])

In [49]: timeit la.solve(u,la.solve(l,p.T@b))

137 μs ± 342 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

我不知道這些計算將如何擴展。



In [50]: lu_and_piv = la.lu_factor(A)

In [51]: lu_and_piv

Out[51]:?

(array([[ 7.? ? ? ? ,? 5.? ? ? ? ,? 6.? ? ? ? ,? 6.? ? ? ? ],

? ? ? ? [ 0.28571429,? 3.57142857,? 6.28571429,? 5.28571429],

? ? ? ? [ 0.71428571,? 0.12? ? ? , -1.04? ? ? ,? 3.08? ? ? ],

? ? ? ? [ 0.71428571, -0.44? ? ? , -0.46153846,? 7.46153846]]),

?array([2, 2, 3, 3], dtype=int32))

In [52]: la.lu_solve(lu_and_piv, b)

Out[52]: array([-0.21649485,? 2.54639175, -1.54639175,? 0.01030928])

In [53]: timeit la.lu_solve(lu_and_piv, b)

7.47 μs ± 14.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)


查看完整回答
反對 回復(fù) 2023-12-12
  • 1 回答
  • 0 關(guān)注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號