Параметры смешанного режима, более элегантная реализация? - PullRequest
0 голосов
/ 14 апреля 2019

Я пишу некоторый код для преобразования односторонних параметров в параметры смешанного режима. По сути, матрица nxn с элементами массива 1xm должна быть умножена на матрицу скаляров nxn.

Вот мой уродливый код, который работает, я прокомментировал свою неудачную попытку выполнить некоторое тензорное умножение. Функция 'SS' возвращает массив размером 1xm. У меня также есть эти уродливые матрицы инициализации MM и MM2, которых я не могу понять, как их избежать.

    def SS(snp,x,y):
        return np.squeeze(eval("snp.s"+str(x)+str(y)+".s_db"))

    def convert_mixmode(snp, portmap):
        result = int(file[file.find(".s")+len(".s"):file.rfind("p")])
        S = []
        M = 1/np.sqrt(2)*np.matrix([[1,-1,0,0],[1,1,0,0],[0,0,1,-1],[0,0,1,1]])
        MI = np.linalg.inv(M)
        m=0; l=0;
        while l < result:
            A = portmap[m][0]; B = portmap[m][1]; C= portmap[m+1][0]; D = portmap[m+1][1];
            S = np.array([[SS(snp,A,A),SS(snp,A,C),SS(snp,A,B),SS(snp,A,D)],[SS(snp,C,A),SS(snp,B,B),SS(snp,C,B),SS(snp,B,D)],[SS(snp,B,A),SS(snp,B,C),SS(snp,C,C),SS(snp,B,D)],[SS(snp,D,A),SS(snp,D,C),SS(snp,D,B),SS(snp,D,D)]])
            MM = np.array([[np.zeros(S.shape[2]),np.zeros(S.shape[2]),np.zeros(S.shape[2]),np.zeros(S.shape[2])],[np.zeros(S.shape[2]),np.zeros(S.shape[2]),np.zeros(S.shape[2]),np.zeros(S.shape[2])],[np.zeros(S.shape[2]),np.zeros(S.shape[2]),np.zeros(S.shape[2]),np.zeros(S.shape[2])],[np.zeros(S.shape[2]),np.zeros(S.shape[2]),np.zeros(S.shape[2]),np.zeros(S.shape[2])]])
            #MM = np.tensordot(M,np.tensordot(S,np.linalg.inv(M),axes=([0],[0])),axes=([0],[0]))
            for i in range(4):
                for j in range(4):
                    for k in range(4):
                        MM[i,j]=MM[i,j]+S[i,k]*MI[k,j]
            MM2 = np.array([[np.zeros(S.shape[2]),np.zeros(S.shape[2]),np.zeros(S.shape[2]),np.zeros(S.shape[2])],[np.zeros(S.shape[2]),np.zeros(S.shape[2]),np.zeros(S.shape[2]),np.zeros(S.shape[2])],[np.zeros(S.shape[2]),np.zeros(S.shape[2]),np.zeros(S.shape[2]),np.zeros(S.shape[2])],[np.zeros(S.shape[2]),np.zeros(S.shape[2]),np.zeros(S.shape[2]),np.zeros(S.shape[2])]])
            for i in range(4):
                for j in range(4):
                    for k in range(4):
                        MM2[i,j]=MM2[i,j]+MM[i,k]*M[k,j]
            plt.figure()
            plt.plot(MM2[0,2])
            plt.show()
            m+=1; l+=4
        return

    portmap1 = [[1,2],[3,4],[5,6],[7,8],[9,10],[11,12],[13,14],[15,16]]
    portmap2 = [[1,3],[2,4],[5,7],[6,8],[9,11],[10,12],[13,15],[14,16]]
    portmap3 = [[1,9],[2,10],[3,11],[4,12],[5,13],[6,14],[7,15],[8,16]]

    for file in files:
        print(file)
        snp = rf.Network(file)
        convert_mixmode(snp, portmap1)

Мой результат сейчас должен быть матрицей 4х4. В конечном итоге это будет матрица 4x4, объединенная в матрицу 4x4m или 4mx4, где m = n / 4 в файле snp. Есть мысли или предложения?

...