2014-11-10 3 views
0

Например, у меня есть эрмитову матрицы, А и я диагонализирующие это с матрицей 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 

Который прямо вперед.

Я хочу создать модуль. Допустим, у меня будет вход 100 различных эрмитовы матрицы и импорта модульв существующем питона сценарии для вычисления 100 различных матриц В (для каждого из различных входов).

EDIT (сделать мой вопрос более общий)

Причина: Причиной создания модуляявляется использование его в более общей цели. Под общим я имею в виду, скажем, в одном скрипте python, у меня разные типы матриц (например, эрмитова матрица, вещественная матрица, общая сложная матрица); теперь диагонализация различных типов матриц различна. поэтому я хочу создать модуль (который содержит различные процедуры диагонализации в зависимости от типа матрицы) и называть его всякий раз, когда мне нужно диагонализировать любую матрицу.

Исповедь: я понятия не имею, как создать модуль.

+3

Честный вопрос: Что такое реализовать? – Greg

+0

мой плохой, я думаю, что соответствующее слово будет «модулем» вместо «реализовать». Я отредактирую свой вопрос/заголовок. – string

ответ

1

Что вы можете сделать, это использовать словаря для хранения 100 входных эрмитовых матриц, используя для цикла как:

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] дает -ю входную матрицу d 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) 
+0

благодарю вас за ответ. Я собираюсь изучить ваш ответ now.BTW, я понял, что моя цель немного более общая, поэтому я только что отредактировал свой вопрос, прошу прощения за поздний перевод. Надеюсь, вы могли бы помочь мне с это тоже. – string

+0

@string Я создал модуль для diagonal_matrix. Надеюсь, он решает проблему. –

+0

, когда я пытаюсь использовать созданный вами модуль, он дает мне ошибку, «объект модуля» не имеет атрибута «диагонализировать». что мне не хватает? Есть идеи? – string

Смежные вопросы