この 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 を使用してコンパイルされています。私を助けてください!!