2017-12-31 29 views
0
  • Ein Programm put Werte in eine Matrix mit einer 3 x 3-Matrix X symmetrisch, zu bilden und dann Determinante von X berechnen
  • Das Programm wird mit kompilierten g++ -Ofast
  • wird den Programm verwenden Sie nur 6 floats in X für die Berechnung der Determinante, weil X symmetrisch ist?

ProgrammDeterminante einer symmetrischen Matrix in Eigen3

#include <Eigen/Eigen> 
#include <iostream> 
#include <cstdlib> 
#include <ctime> 
template <typename T> 
T symdet(T a) { 
    Eigen::Matrix<T, 3, 3> X; 
    X(0, 0) = a; 
    X(1, 1) = 2 * a; 
    X(2, 2) = 3 * a; 
    X(0, 1) = X(1, 0) = 4 * a; 
    X(0, 2) = X(2, 0) = 5 * a; 
    X(1, 2) = X(2, 1) = 6 * a; 
    return X.determinant(); 
} 
int main() { 
    srand (static_cast <unsigned> (time(0))); 
    float a = static_cast<float>(rand())/static_cast<float>(RAND_MAX); 
    std::cout << symdet(a) << "\n"; 
} 
+0

Test bei godbolt.org zeigt, dass der Compiler Register verwenden kann, um kleine statische Arrays zu ersetzen: https://godbolt.org/g/F1grsW – rxu

+0

Wenn die Frage nach der Verwendung von 6 Floats mit dem Determinantenalgorithmus zusammenhängt, wäre es sicher 6 eindeutige Zahlen (obwohl die Formel alle 9 Zahlen berücksichtigen würde). Wenn die Frage ist, wie der Compiler die Determinantenberechnungen optimieren würde, siehe den obigen Kommentar. – NameRakes

+0

Nur auf Geschwindigkeit achten. weniger Floats -> weniger Multiplikation und Addition -> schnellere Berechnung. – rxu

Antwort

0

Wahrscheinlich kann es, weil es nicht vektorisiert Operationen ohnehin verwendet, ist. ich eine lokale Instanz von Compiler-Explorer installiert: https://github.com/mattgodbolt/compiler-explorer

C++ Code:

#include <Eigen/Eigen> 
float symdet(float a, float b, float c, float d, float e, float f) { 
    Eigen::Matrix<float, 3, 3> X; 
    X(0, 0) = a; 
    X(1, 1) = b; 
    X(2, 2) = c; 
    X(0, 1) = X(1, 0) = d; 
    X(0, 2) = X(2, 0) = e; 
    X(1, 2) = X(2, 1) = f; 
    return X.determinant(); 
} 

Assembly (g ++ - 7 -Ofast -I):

symdet(float, float, float, float, float, float): 
    movaps xmm6, xmm1 
    mulss xmm1, xmm4 
    movaps xmm7, xmm5 
    mulss xmm6, xmm2 
    mulss xmm7, xmm5 
    mulss xmm2, xmm3 
    subss xmm6, xmm7 
    mulss xmm0, xmm6 
    movaps xmm6, xmm4 
    mulss xmm6, xmm5 
    subss xmm2, xmm6 
    mulss xmm2, xmm3 
    mulss xmm3, xmm5 
    subss xmm0, xmm2 
    subss xmm3, xmm1 
    mulss xmm4, xmm3 
    addss xmm0, xmm4 
    ret 

Die ss-Operationen Skalar sind, die funktioniert auf nur 1 Gleitkommawert anstelle von Vektoroperationen. Es gibt nur 6 Eingabewerte xmm[0 - 5], xmm[6, 7] hält Zwischenprodukte.

Verwandte Themen