矩阵Julia中乘法函数的应用

矩阵Julia中乘法函数的应用,julia,Julia,假设交换矩阵J的特征向量给出了基的变化。现在假设我生成一个随机矩阵,使得H=H^T。例如,我的H是: [-4.339231145150657 -1.9513538676596298 0.022375597517700463 0.0 -1.9513538676596298 -1.292344753373925 1.3152010547965873 0.022375597517700463 0.022375597517700463 1.3152010547965873 -1.109645984220

假设交换矩阵J的特征向量给出了基的变化。现在假设我生成一个随机矩阵,使得H=H^T。例如,我的H是:

[-4.339231145150657 -1.9513538676596298 0.022375597517700463 0.0
-1.9513538676596298 -1.292344753373925 1.3152010547965873 0.022375597517700463
0.022375597517700463 1.3152010547965873 -1.1096459842204194 4.229348916735498
0.0 0.022375597517700463 4.229348916735498 -3.79113483769014]
然后,如果我想换成“J”基,我必须做线性变换:evecJ^T*H*evecJ(evecJ是J的向量矩阵)。所以逆变换应该把我带回到H的原始值。但是,如果我这样做的话,情况就不是这样了

*(evecJ',H,evecJ)
*(evecJ,H,evecJ')
如果我有

evecJT = evecJ'
*(evecJT,H,evecJ)
*(evecJ,H,evecJT)

为什么这是两种不同的方法?没有更多的信息很难知道,但我猜这是两个因素的组合:

  • Julia的语义与语法不完全一致的少数情况之一是带有转置参数的乘法或除法,即
    A'*B
    形式的运算:它将尝试用
    Ac_mul_B
    等函数替换这些函数,以调用适当的BLAS函数,避免中间分配。然而,如果转置发生在其他地方,它就不能做到这一点。换句话说,
    J'*H
    JT=J';JT*H
    实际上会在内部调用不同的函数

  • 矩阵乘法涉及大量浮点数的中间舍入,因此精确结果将取决于运算的执行顺序。这里似乎有可能的是,在非转置和转置情况下使用的顺序实际上是不同的


  • 你能发布更多的代码来说明如何生成
    evecJ
    ?Julia识别了一些语法,例如
    X*Y'
    ,并将它们直接降低到BLAS原语,这些原语在乘法过程中有效地进行了转置(实际上没有重新排列矩阵)。在第二个版本中不会发生这种情况,但它应该有相同的结果。张贴
    evecJ
    的值会很有帮助。是的,首先我构建了de 0,1矩阵,然后我只做了
    eigvalsJ,evecJ=eig(J)