2017-07-13 10 views
0

Ich habe einen grundlegenden C++ - Code zusammengestellt, der zwei Matrizen aus Textdateien in C++ liest und mit Hilfe der Eigen-Bibliothek das verallgemeinerte Eigenwertproblem löst. Dies funktioniert einwandfrei und gibt mir die erwarteten Ergebnisse bei Verwendung des Datentyps double und MatrixXd.Segmentierungsfehler beim Lesen der Matrix aus Datei in Eigenes mpfr

Für eine bestimmte Instanz muss dieser Code mit höherer Genauigkeit ausgeführt werden. Vom Blick auf die Dokumentation, hat Eigen mpfr support, die ich versucht haben, zu implementieren, aber den Fehler:

Segmentation fault (core dumped) 

Ich habe das Problem mit dem Code verengt, die aus den Textdateien in den Matrizen liest. Im älteren Code, der den double-Datentyp verwendet, gibt es keine Deklaration irgendwelcher mpfr-Typen, und anstelle von MatrixXmp verwende ich den Standard MatrixXd.

Dieser minimale Funktionsbeispielcode betrifft nur das Einlesen der Datei, da dort der Fehler auftritt. Die Matrix-Datei test1.txt hat nur das einfache Format (Beispiel für eine 2 x 2-Matrix):

1.368237598319937 8.572948739583564 
0.582759275301284 8.457285728753445 

Hier ist die Haupt-C++ Code

#include <iostream> 
#include <fstream> 
#include <string> 
#include <iomanip> 
#include <Eigen/Dense> 
#include <Eigen/Eigenvalues> 
#include <stdint.h> 
#include <stdio.h> 
#include <Eigen/MPRealSupport> 
using namespace mpfr; 
using namespace std; 
using namespace Eigen; 

#define MAXBUFSIZE ((int) 1e6) 
typedef Matrix<mpreal,Dynamic,Dynamic> MatrixXmp; 
typedef Matrix<mpreal,Dynamic,1>  VectorXmp; 

// The following declares a read function to read in a matrix file 
MatrixXmp readMatrix(const char *filename) 
    { 
    int cols = 0, rows = 0; 
    mpreal buff[MAXBUFSIZE]; 

    // Read numbers from file into buffer. 
    ifstream infile; 
    infile.open(filename); 
    while (! infile.eof()) 
     { 
     string line; 
     getline(infile, line); 

     int temp_cols = 0; 
     stringstream stream(line); 
     while(! stream.eof()) 
      stream >> buff[cols*rows+temp_cols++]; 

     if (temp_cols == 0) 
      continue; 

     if (cols == 0) 
      cols = temp_cols; 

     rows++; 
     } 

    infile.close(); 

    rows--; 

    MatrixXmp result(rows,cols); 
    for (int i = 0; i < rows; i++) 
     for (int j = 0; j < cols; j++) 
      result(i,j) = buff[ cols*i+j ]; 

    return result; 
    }; 

int main() 
{ 
    // set precision to 256 bits (double has only 53 bits) 
    mpreal::set_default_prec(256); 

    MatrixXmp A = readMatrix("test1.txt"); 
} 

Zuerst ich, dass alle der Verknüpfung der überprüfen wollte Bibliotheken wurde richtig gemacht, also die Zeile auskommentiert und das Beispielproblem von der mpfr Eigen-Seite eingefügt, die kompiliert und ohne Probleme lief. Dies beschränkt es auf die Lesefunktion, aber ich kann nicht sehen, was das Problem ist, und es funktioniert perfekt, wenn Sie den double Datentyp verwenden. Ich bin sicher, dass ich etwas Offensichtliches vermisse, und jede Hilfe würde sehr geschätzt werden.

EDIT

inklusive Stack-Trace:

*** Segmentation fault 
Register dump: 

RAX: 00007fff15cc73e0 RBX: 0000000000000000 RCX: 0000000000000042 
RDX: 0000000000000100 RSI: 0000000000402bff RDI: 00007fff15cc73e0 
RBP: 00007fff15cc73c0 R8 : 00007fd24417fac0 R9 : 00007fd244174780 
R10: 0000000000000016 R11: 00007fd2445ffae0 R12: 0000000000401650 
R13: 00007fff15cc74f0 R14: 0000000000000000 R15: 0000000000000000 
RSP: 00007fff02b99fa0 

RIP: 0000000000401756 EFLAGS: 00010206 

CS: 0033 FS: 0000 GS: 0000 

Trap: 0000000e Error: 00000006 OldMask: 00000000 CR2: 02b99fa8 

FPUCW: 0000037f FPUSW: 00000000 TAG: 00000000 
RIP: 00000000 RDP: 00000000 

ST(0) 0000 0000000000000000 ST(1) 0000 0000000000000000 
ST(2) 0000 0000000000000000 ST(3) 0000 0000000000000000 
ST(4) 0000 0000000000000000 ST(5) 0000 0000000000000000 
ST(6) 0000 0000000000000000 ST(7) 0000 0000000000000000 
mxcsr: 1f80 
XMM0: 00000000000000000000000000000000 XMM1:  00000000000000000000000000000000 
XMM2: 00000000000000000000000000000000 XMM3: 00000000000000000000000000000000 
XMM4: 00000000000000000000000000000000 XMM5: 00000000000000000000000000000000 
XMM6: 00000000000000000000000000000000 XMM7: 00000000000000000000000000000000 
XMM8: 00000000000000000000000000000000 XMM9: 00000000000000000000000000000000 
XMM10: 00000000000000000000000000000000 XMM11: 00000000000000000000000000000000 
XMM12: 00000000000000000000000000000000 XMM13: 00000000000000000000000000000000 
XMM14: 00000000000000000000000000000000 XMM15: 00000000000000000000000000000000 

Backtrace: 
/home/main.cpp:30(_Z10readMatrixPKc)[0x401756] 
/home/main.cpp:101(main)[0x401c22] 
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7fd243841830] 
??:?(_start)[0x401679] 

Memory map: 

00400000-00404000 r-xp 00000000 08:01 3861463 /home/ 
00604000-00605000 r--p 00004000 08:01 3861463 /home/ 
00605000-00606000 rw-p 00005000 08:01 3861463 /home/ 
01174000-011a6000 rw-p 00000000 00:00 0 [heap] 
7fd243298000-7fd2433a0000 r-xp 00000000 08:01 2243272 /lib/x86_64-linux-gnu/libm-2.23.so 
7fd2433a0000-7fd24359f000 ---p 00108000 08:01 2243272 /lib/x86_64-linux-gnu/libm-2.23.so 
7fd24359f000-7fd2435a0000 r--p 00107000 08:01 2243272 /lib/x86_64-linux-gnu/libm-2.23.so 
7fd2435a0000-7fd2435a1000 rw-p 00108000 08:01 2243272 /lib/x86_64-linux-gnu/libm-2.23.so 
7fd2435a1000-7fd243620000 r-xp 00000000 08:01 6191906 /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.0 
7fd243620000-7fd24381f000 ---p 0007f000 08:01 6191906 /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.0 
7fd24381f000-7fd243820000 r--p 0007e000 08:01 6191906 /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.0 
7fd243820000-7fd243821000 rw-p 0007f000 08:01 6191906 /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.0 
7fd243821000-7fd2439e0000 r-xp 00000000 08:01 2243263 /lib/x86_64-linux-gnu/libc-2.23.so 
7fd2439e0000-7fd243be0000 ---p 001bf000 08:01 2243263 /lib/x86_64-linux-gnu/libc-2.23.so 
7fd243be0000-7fd243be4000 r--p 001bf000 08:01 2243263 /lib/x86_64-linux-gnu/libc-2.23.so 
7fd243be4000-7fd243be6000 rw-p 001c3000 08:01 2243263 /lib/x86_64-linux-gnu/libc-2.23.so 
7fd243be6000-7fd243bea000 rw-p 00000000 00:00 0 
7fd243bea000-7fd243c00000 r-xp 00000000 08:01 2229287 /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fd243c00000-7fd243dff000 ---p 00016000 08:01 2229287 /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fd243dff000-7fd243e00000 rw-p 00015000 08:01 2229287 /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fd243e00000-7fd243f72000 r-xp 00000000 08:01 6168047 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 
7fd243f72000-7fd244172000 ---p 00172000 08:01 6168047 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 
7fd244172000-7fd24417c000 r--p 00172000 08:01 6168047 /usr/lib/x86_64- linux-gnu/libstdc++.so.6.0.21 
7fd24417c000-7fd24417e000 rw-p 0017c000 08:01 6168047 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 
7fd24417e000-7fd244182000 rw-p 00000000 00:00 0 
7fd244182000-7fd2441e5000 r-xp 00000000 08:01 6180286 /usr/lib/x86_64-linux-gnu/libmpfr.so.4.1.4 
7fd2441e5000-7fd2443e4000 ---p 00063000 08:01 6180286 /usr/lib/x86_64-linux-gnu/libmpfr.so.4.1.4 
7fd2443e4000-7fd2443e6000 r--p 00062000 08:01 6180286 /usr/lib/x86_64-linux-gnu/libmpfr.so.4.1.4 
7fd2443e6000-7fd2443e7000 rw-p 00064000 08:01 6180286 /usr/lib/x86_64-linux-gnu/libmpfr.so.4.1.4 
7fd2443e7000-7fd2443eb000 r-xp 00000000 08:01 2243269 /lib/x86_64-linux-gnu/libSegFault.so 
7fd2443eb000-7fd2445ea000 ---p 00004000 08:01 2243269 /lib/x86_64-linux-gnu/libSegFault.so 
7fd2445ea000-7fd2445eb000 r--p 00003000 08:01 2243269 /lib/x86_64-linux-gnu/libSegFault.so 
7fd2445eb000-7fd2445ec000 rw-p 00004000 08:01 2243269 /lib/x86_64-linux-gnu/libSegFault.so 
7fd2445ec000-7fd244612000 r-xp 00000000 08:01 2230157 /lib/x86_64-linux-gnu/ld-2.23.so 
7fd2447d0000-7fd2447d6000 rw-p 00000000 00:00 0 
7fd24480f000-7fd244811000 rw-p 00000000 00:00 0 
7fd244811000-7fd244812000 r--p 00025000 08:01 2230157 /lib/x86_64-linux-gnu/ld-2.23.so 
7fd244812000-7fd244813000 rw-p 00026000 08:01 2230157 /lib/x86_64-linux-gnu/ld-2.23.so 
7fd244813000-7fd244814000 rw-p 00000000 00:00 0 
7fff15ca8000-7fff15cc9000 rw-p 00000000 00:00 0 [stack] 
7fff15de8000-7fff15dea000 r--p 00000000 00:00 0 [vvar] 
7fff15dea000-7fff15dec000 r-xp 00000000 00:00 0 [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] 
+2

'mpreal buff [MAXBUFSIZE]' als lokale Variable könnte das Stacklimit überschreiten; nur für die Diagnose, versuchen Sie, diese Variable "global" zu machen, d. h. definieren Sie sie auf Dateiebene direkt nach der '#define MAXBUFSIZE' ... Lassen Sie uns wissen, ob es dann funktioniert oder nicht. –

+0

Gegeben der Fehler ist ein segfault könnte Sie den Stack-Trace buchen? – IlBeldus

+0

'while (! Infile.eof())' - Sie sollten [dies lesen] (https://stackoverflow.com/questions/5605125/why-isostreameof-inside-a-loop-condition-sidered-wrong) – PaulMcKenzie

Antwort

1

Du bist wahrscheinlich zu viel Stack-Speicher Zuweisung, wie @StephanLechner sagte. Nämlich 32 MB, da MAXBUFSIZE ist 1000000 und Sie machten jeden Eintrag nehmen at least 32 Bytes mit mpreal::set_default_prec. Das ist viel mehr als mein Standardlimit von 8 MB unter Mac OS 10.12.5.

Ich lief Ihren ursprünglichen Code und bekam einen Seg Fehler. Ich änderte den Code Heap-Speicher für buff zuzuweisen, und es lief gut: statt

mpreal buff[MAXBUFSIZE]; 

Schreib

mpreal *buff = new mpreal[MAXBUFSIZE]; 

Sie sollten es natürlich später delete.

+0

Natürlich hätte ich das bemerkt. Danke dir und auch @StephanLechner. – Yeti

Verwandte Themen