2016-06-28 18 views
0

Ich versuche die Frobenius-Norm eines Tensors mit dem Tensor-Modul der Eigen3-Bibliothek zu berechnen.Auswertung der Reduktion entlang aller Dimensionen in Eigen3 Tensor-Klasse

Hier ist mein Code:

#include <unsupported/Eigen/CXX11/Tensor> 

int main() 
{ 
    Eigen::Tensor<double, 3> t(4, 3, 2); 
    t.setRandom(); 

    // Computing the Frobenius norm. The result is a single scalar value. 
    const auto frob_norm_op = t.square().sum().sqrt().eval(); 

    // Is there an easier way to extract the scalar value ? 
    Eigen::TensorEvaluator<const decltype(frob_norm_op), Eigen::DefaultDevice> 
    frob_norm_eval (frob_norm_op, Eigen::DefaultDevice()); 
    const double frob_norm = frob_norm_eval.coeff(0); 

    return 0; 
} 

Dies funktioniert, aber ich denke, dass es ein einfacherer Weg geben frob_norm von frob_norm_op zu extrahieren. Irgendwelche Ideen?

The example der Dokumentation löst einen Laufzeitfehler aus.

Antwort

0

Ich antworte mir selbst. Ich weiß nicht, ob es der beste Weg ist, aber es ist Sortierer als der vorherige:

#include <unsupported/Eigen/CXX11/Tensor> 

int main() 
{ 
    Eigen::Tensor<double, 3> t(4, 3, 2); 
    t.setRandom(); 

    const Eigen::Tensor<double, 0> frob_norm_tens = t.square().sum().sqrt(); 
    const double frob_norm = frob_norm_tens.coeff(); 

    return 0; 
}