0

この Seg エラーを見たことがありません。助けてください。GDBで私はこれを得ました:

Program received signal SIGSEGV, Segmentation fault.
#0  0x0000000000401c08 in InvLib::pinv_jazz (
    this=<error reading variable: Cannot access memory at address 0x7fffff766188>, 
    r=<error reading variable: Cannot access memory at address 0x7fffff766184>, 
    co=<error reading variable: Cannot access memory at address 0x7fffff766180>, 
    A=<error reading variable: Cannot access memory at address 0x7fffff766178>,  
    Ai=<error reading variable: Cannot access memory at address 0x7fffff766170>)  
    at ../eigen/../inc/InvLib.h:288  
288       void pinv_jazz(const int r, const int co, double *A, double *Ai)  {
#1  0x00000000004022de in init_Ai (this=<optimized out>) at ../eigen/../inc/InvLib.h:624
#2  InvLib::test_col_updating () at ../eigen/../inc/InvLib.h:918   
#3  0x000000000040fb2a in InvLib::test_lib () at ../eigen/../inc/InvLib.h:1140  
#4  0x0000000000400c88 in main (argc=1, argv=0x7fffffffe758) at til.cc:6   

私が理解しているように、InvLib::pinv_jazz によって取り込まれたすべての値は無効です。これは奇妙です。最初に init_Ai と pinv_jazz の定義を提供させてください:

class InvLib {
      ...

// initialize Ai to be pinv(A) using SVD   
inline __attribute__((always_inline))   
  void init_Ai()  {   
  printf ("%p\n", this);   
  printf ("%d %d\n", m_r, m_co);  
  printf ("%p %p\n", m_A, m_Ai); 
  pinv_jazz(m_r, m_co, m_A, m_Ai); 
}  

// compute SVD-inv on a mat_t matrix  
void pinv_jazz(const int r, const int co, double *A, double *Ai)  {   
  static CoeffMat eA, eAi;  
  static int i, j;     
  static double *A_, *Ai_;  
  assert(r <= MAXSIZE); 
  assert(co <= MAXSIZE); 

  printf ("my %p %p\n", A, Ai);    

  eA.resize(r, co);    
  A_ = A;  
  for (i = 0; i < r; i++)      {   
      for (j = 0; j < co; j++)      {    
          eA(i, j) = Complex(*A_, *(A_+1));   
          A_ += 2;     
        }  
    }  
  //eAi = eigen_pinv(&eA);    

  {   
    Eigen::JacobiSVD<CoeffMat> svdx(eA,   Eigen::ComputeThinU      
                                        | Eigen::ComputeThinV); 
    Eigen::MatrixXf Ss;      
    int n = svdx.singularValues().asDiagonal().rows();  
    printf ("%d\n", n);               
    Ss.resize(n, 1);      
    int i;  
    for (i = 0; i < n; i++)      {             
      Ss(i) = svdx.singularValues()(i);  
    } 
    CoeffMat S;     
    S.resize(n, 1);    
    for (i = 0; i < n; ++i)       {    
      if ( Ss(i) > TOLE_PINV )   
        { S(i)=1.0/Ss(i); }     
      else   
        { S(i)=0; }      
    } 
    eAi = svdx.matrixV() * S.asDiagonal() * svdx.matrixU().adjoint();   
  }
} 

} //InvLib 

なぜpinv_jazzがGDBの出力でInvLib::pinv_jazzと書かれているのに、init_Aiがinit_Aiと書かれているのか、最初に理解できませんか? どちらも非静的関数です!

次に、GDB は 0x7fffff766188 などでメモリにアクセスできないと訴えますが、init_Ai で、pinv_jazz を呼び出す前に m_A と m_Ai の値を出力して pinv_jazz に入れましたが、GDB が訴える 0x7fffff766178 または 0x7fffff766170 ではありません。GDB はどこでアドレス 0x7fffff766178 と 0x7fffff766170 を取得したのだろうか?

行 eAi = svdx.matrixV() * S.asDiagonal() * svdx.matrixU().adjoint(); を削除すると、3番目に奇妙になります。その後、エラーなしでスムーズに実行されます。しかし、この行が上記のエラーを引き起こす理由がわかりません。

コードは、-O0 を指定して GCC 4.6.3 を使用してコンパイルされています。私を助けてください!!

4

0 に答える 0