python生成Toeplitz行列
6694 ワード
python生成Toeplitz行列
まず必要な依存ファイルをインポート
実装する機能を明確にする
Toeplitz行列定義:[−2,−1,0,1,2.]のような所定の単数項の数列をリンクする.\left[-2,-1,0,1,2.\right] [−2,−1,0,1,2.] 中心項0 0 0 0を起点として行列の構築を開始する:[0−1−2 1 0−1 2 2 2 1 0]begin{bmatrix}0&−1&−2\1&0−1&1&0end{bmatrix}⎣012−101−2−10⎦⎤事実上、これはCirculant行列である.Toeplizeに基づいて、Circulantのさらなる要件は、各ローベクトルであり、前のローベクトルのサイクルが1つの要素を右にシフトすることである.
汎用コード
出力:
関数として書く
簡単すぎて、メモを取っておいて、後で万一使います.呼び出して5を生成すると仮定します× 5 5\times 5 5×5のToeplitz行列、すなわちm+1=5 m+1=5 m+1=5 m+1=5.
まず必要な依存ファイルをインポート
import numpy as np
from scipy.linalg import toeplitz
実装する機能を明確にする
Toeplitz行列定義:[−2,−1,0,1,2.]のような所定の単数項の数列をリンクする.\left[-2,-1,0,1,2.\right] [−2,−1,0,1,2.] 中心項0 0 0 0を起点として行列の構築を開始する:[0−1−2 1 0−1 2 2 2 1 0]begin{bmatrix}0&−1&−2\1&0−1&1&0end{bmatrix}⎣012−101−2−10⎦⎤事実上、これはCirculant行列である.Toeplizeに基づいて、Circulantのさらなる要件は、各ローベクトルであり、前のローベクトルのサイクルが1つの要素を右にシフトすることである.
汎用コード
m = 4 #
N = 2 * m + 1 #
d = np.arange(1, N+1)
d2 = d[::-1]
t = toeplitz(d[m:], d2[m:])
print(t)
出力:
d = [1 2 3 4 5 6 7 8 9]
t =
[[5 4 3 2 1]
[6 5 4 3 2]
[7 6 5 4 3]
[8 7 6 5 4]
[9 8 7 6 5]]
[Finished in 0.5s]
関数として書く
def gen_toeplitz(m, array):
'''
m:
array:
'''
# N = 2 * m + 1 #
list2 = array[::-1] #
t_matrix = toeplitz(array[m:], list2[m:])
return t_matrix
簡単すぎて、メモを取っておいて、後で万一使います.呼び出して5を生成すると仮定します× 5 5\times 5 5×5のToeplitz行列、すなわちm+1=5 m+1=5 m+1=5 m+1=5.
if __name__ == '__main__':
m = 5-1
array = np.arange(2 * m + 1)
T_m = gen_toeplitz(m, array)
print(array)
print(T_m)