2017-04-25 3 views
0

Ich versuche, ein Objekt vom Typ ODE_vector zu einem Gürteltier vec im Armadillo so zu konvertieren, dass das neue Objekt der lineare algebraische Funktionalität der Armadillo-Bibliothek erben. Als ein einfaches Beispiel des Problems ich dies mit ist eine Demonstration eine C++ Array mit:fortgeschrittene Konstrukteure verwenden Array zu konvertieren vec

#include <iostream> 
#include <random> 
#include <armadillo> 

using namespace std; 
using namespace arma; 

int main() { 

double b1 = 0.2; 
double b2 = 0.1; 
const double state[2] = {b1, b2}; 

rowvec B(&state[0], 2); 
cout << B << endl; 

mat A(2,2); A.fill(0.2); A.diag().ones(); 
cout << A << endl; 

cout << B(0) * A(0,0) << endl; // x 

return 0; 

} 

Die Daten in b1 enthalten ist, und b2 wird in den Elementen B gespeichert, so dass dieses Skript laufen gibt die folgende:

0.2000 
    0.1000 

    1.0000 0.2000 
    0.2000 1.0000 

0.2 

wenn ich jedoch Linie x ersetzen oben mit

cout << B * A << endl; 

bekomme ich Fehler darauf hindeutet, B die Standard Gürteltier lineare Algebra Funktionalität nicht geerbt hat:

[ 50%] Building CXX object CMakeFiles/untitled.dir/main.cpp.o 
[100%] Linking CXX executable untitled 
CMakeFiles/untitled.dir/main.cpp.o: In function `void arma::blas::gemv<double>(char const*, int const*, int const*, double const*, double const*, int const*, double const*, int const*, double const*, double*, int const*)': 
/usr/include/armadillo_bits/wrapper_blas.hpp:36: undefined reference to `wrapper_dgemv_' 
CMakeFiles/untitled.dir/main.cpp.o: In function `void arma::blas::gemm<double>(char const*, char const*, int const*, int const*, int const*, double const*, double const*, int const*, double const*, int const*, double const*, double*, int const*)': 
/usr/include/armadillo_bits/wrapper_blas.hpp:71: undefined reference to `wrapper_dgemm_' 
collect2: error: ld returned 1 exit status 
CMakeFiles/untitled.dir/build.make:94: recipe for target 'untitled' failed 
make[3]: *** [untitled] Error 1 
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/untitled.dir/all' failed 
make[2]: *** [CMakeFiles/untitled.dir/all] Error 2 
CMakeFiles/Makefile2:79: recipe for target 'CMakeFiles/untitled.dir/rule' failed 
make[1]: *** [CMakeFiles/untitled.dir/rule] Error 2 
Makefile:118: recipe for target 'untitled' failed 
make: *** [untitled] Error 2 

Kann mir jemand erklären, wie man richtig die erweiterten Konstrukteure (arma documentation) verwenden, um diese Funktion zu erhalten?

Danke

Antwort

0

Sie müssen das richtige Format in der Multiplikation haben. Typ B ist ein 2x1 und A ist 2x2. Wechseln Sie in

mat B(&state[0], 1,2); 

oder

rowvec B(&state[0], 2); 
+0

Ich wünschte, es so einfach wäre !! Ich habe verschiedene Kombinationen von Gürteltier-Klassen ausprobiert, aber das löst das Problem nicht. Ich werde die Frage bearbeiten, um Verwirrung zu vermeiden und danke für den Vorschlag. –

+0

Sind Sie sicher, dass BLAS in Ihrem Build aktiviert ist? Für mich sind die beiden Alternativen der Linie ‚x‘ oben hat gut funktioniert. –

+0

Sie haben Recht! es war nicht richtig verbunden sind, war es ein CMake Problem ... Wenn jemand anderes, wenn die ähnliche Probleme auf diesen Link finden Sie unter: https://intellij-support.jetbrains.com/hc/en-us/community/posts/205823019 -Error-Compiling-Code-mit-Gürteltier DANKE FÜR DIE HILFE !! –