实施[ X, ⋅ ][X,⋅]作为一个矩阵,其中是一个矩阵n2×n2n2×n2XXn × nn×n

计算科学 线性代数 Python 矩阵 麻木的
2021-12-15 05:10:14

表示具有实数项的矩阵的集合。我有一个矩阵,我想实现线性运算符作为矩阵,其中该运算符以下列方式定义:Mn(R)n×nn×nXMn(R)[X,]:Mn(R)Mn(R)n2×n2

[X,](Y)=[X,Y].

为此,我定义了的常用基础:Mn(R)

B={B(i,j)}i,j=1nB(i,j)=eiejT has 1 in ith column, jth row; 0 elsewhere.

那么,的元素就变成维向量,而就是作用在这些向量上的矩阵。为了获得这个矩阵,我为所有,并将得到的矩阵存储为我的矩阵表示的列。Mn(R)n2[X,][X,B(i,j)]i,jn×nn2×n2

但是,如果我遵循上述程序,我最终会得到而不是的矩阵表示,我的问题是:我在这里有概念上的误解,还是我的实现(如下所示)不正确?我在想也许我错误地索引了我的二维数组,但是从下面玩弄似乎并不能解决问题。[XT,][X,]i,j,k,l

import numpy as np

def commutator_matrix(X):
    n = np.shape(X)[0] 
    output = np.zeros([n**2, n**2])
    
    for i in range(n): 
        for j in range(n): 

            #obtain commutator [X, B(i,j)]
            B = np.zeros([n, n])
            B[i][j] = 1
            com = X@B - B@X

            #store com as (i*n + j)th column of output
            for k in range(n): 
                for l in range(n): 
                    #(i,j) -> i*n + j is index for B(i,j)
                    #(k,l) -> k*n + l is index for (k,l)th matrix element of B(i,j)
                    output[i*n + j][k*n + l] = com[k][l]
    
    return output
2个回答

您可以利用Kronecker 产品来简化您的commutator_matrix函数,而不是使用 4 级嵌套循环

def commutator_matrix(X):
    id = np.identity(np.shape(X)[0])
    return np.kron(np.transpose(X), id) - np.kron(id, X)

这仍然是您想要的转置。您正在寻找的功能是

def commutator_matrix_correct(X):
    id = np.identity(np.shape(X)[0])
    return np.kron(X, id) - np.kron(id, np.transpose(X))

如果您坚持使用 for 循环,您可以手动计算 Kronecker 产品。

output[i*n + j][k*n + l] = com[k][l]

我认为这是你的错误——反向索引。要计算与线性算子相关的矩阵(通常在线性代数课程中教授的方式),您需要以输入空间为基础,计算每个,并将其坐标(输出空间的基础)写为M相反,您将它们连续写入,因为您让第二个索引而不是第一个索引发生变化。尝试Mfe1,,enf(eJ)JJM

output[k*n + l][i*n + j] = com[k][l].