例如,我有一个 Hermitian矩阵,A ,我对角线,矩阵B 为:
A11= -0.0034
A12= -0.007 -1j*0.0098
A13= -0.0112 - 1j*0.0712
A21= A12.conjugate()
A22= 0.2162
A23= 1.062 - 1j*0.0584
A31= A13.conjugate()
A32= A23.conjugate()
A33= 2.462
A= matrix([[A11,A12,A13],[A21,A22,A23],[A31,A32,A33]])
eigenvalues_of_A, eigenvectors_of_A = numpy.linalg.eig(A);
B = eigenvectors_of_A[:,abs(eigenvalues_of_A).argsort()]
diagonal_matrix= B.I * A * B
这是直截了当的。
我想要的是创建模块。假设我将在现有的python脚本中输入100个不同的 Hermitian矩阵和导入 模块来计算100个不同的 B矩阵< / strong>(对于每个不同的输入)。
编辑(让我的问题更加通用)
原因:创建模块的原因是更广泛地使用它。一般来说,我的意思是,在单个python脚本中,我有不同类型的矩阵(例如,Hermitian矩阵,实矩阵,一般复矩阵);现在不同类型矩阵的对角化是不同的。所以我想创建一个模块(根据矩阵的类型包含不同的对角化过程),并在需要对任何矩阵进行对角化时调用它。
忏悔:我不知道如何创建模块。
答案 0 :(得分:1)
您可以使用字典使用for循环存储100个输入 Hermitian矩阵:
input_dict={}
for i in range(100):
new_A = matrix([[A11,A12,A13],[A21,A22,A23],[A31,A32,A33]]) # new input matrix (A)
input_dict[i] = new_A
之后使用另一个字典存储100个 B矩阵:
B_matrices={}
for i in input_dict.keys():
eigenvalues_of_A, eigenvectors_of_A = numpy.linalg.eig(input_dict[i]);
B = eigenvectors_of_A[:,abs(eigenvalues_of_A).argsort()]
B_matrices[i] = B
现在,input_matrix[i]
为您提供第i个输入矩阵,B_matrices[i]
为您提供相应的 B矩阵。
您可以为对角矩阵创建一个模块:
def diagonalize(A):
eigenvalues_of_A, eigenvectors_of_A = numpy.linalg.eig(A);
B = eigenvectors_of_A[:,abs(eigenvalues_of_A).argsort()]
diagonal_matrix= B.I * A * B
return diagonal_matrix
现在称之为:
diagonal_matrix = diagonalize(A)