簡體   English   中英

在 python 中創建一個連續矩陣冪數組:什么是最佳的?

[英]Creating an array of successive matrix powers in python: what is optimal?

我經常必須創建一個包含運算符的連續冪的矩陣數組
(例如,當對常微分方程積分時,或計算運算符的多項式函數時)。

但是我不知道什么是最好的方法來做到這一點。 似乎使用 for 循環是相當明智的,因此可以通過將x**(k-1)x相乘來增量填充數組以獲得x**k ,並避免重復太多代價高昂的矩陣乘法。 有沒有更好的結構需要注意?

例如,假設我已經將一個秩為 k 的多項式p為一個形狀為 (k) 的一維數組,並且想要編寫一個將多項式應用於形狀為 (n, n) 的方陣x的函數evaluate

def evaluate1 (p, x):
    return np.sum(p * (x ** np.arange(p.shape[0])))

def evaluate2 (p, x):
    powers = [1]
    for i in range(1, p.shape[0]):
        powers.append(np.matmul(powers[-1], x))
    return np.sum(p * np.array(powers))

我會天真地說,通過對小n使用矢量化, evaluate1優於evaluate2 ...

是否有任何evaluate3可以遵循最佳實踐?

更優的方法是利用指數冪。

舉個例子,假設p=8 :然后我們可以只用 3 個步驟而不是 8 個步驟來簡單地計算答案(evaluate2):

1. x2 = x*x
2. x4 = x2*x2
3. x8 = x4*x4 (our desired answer)

這樣時間復雜度降低到log(p)而不是線性的p

我認為它的代碼很簡單。

第一個評估是一個很好的起點,除了

out = x ** np.arange(p.shape[0])

不是最優的。

您可以使用np.cumprod的好處並將其替換為:

y = np.full(p.shape[0], x)
y[0] = 1
out = np.cumprod(y)

更新

計算多個多項式值的例外情況:

p = [0,0,0,1,0,0,0,3,-4,0,0,0,2]
args = [1,2,3,5,10]
val_matrix = np.repeat(args, len(p)).reshape(-1, len(p))
val_matrix[:, 0] = 1
val_matrix = np.cumprod(val_matrix, axis=1)
vals = np.sum(p * val_matrix, axis = 1)

P(x) = x^3 + 3x^7 - 4x^8 + 2x^11args = [1,2,3,5,10]示例運行:

>>> p = [0,0,0,1,0,0,0,3,-4,0,0,0,2]
...
>>> for n in val_matrix.tolist(): print(n)
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096]
[1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049, 177147, 531441]
[1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625, 48828125, 244140625]
[1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 1410065408, 1215752192, -727379968]
>>> vals
array([          2,        7560,     1043226,   486953250, -1824758936])

警告: arg = 10 遇到無效值。您可以通過以下方式為此添加臨時修復:

#replace val_matrix = np.repeat(args, len(p)).reshape(-1, len(p)) with
val_matrix = np.repeat(args, len(p)).reshape(-1, len(p)).astype(np.int64) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM