2017-01-17 1 views
5

Je travaille avec la bibliothèque Armadillo en C++. Au début, je calcule une matrice spéciale (dans mon code: P), puis je calcule la décomposition QR (dans mon code: Q). A la fin j'ai besoin de retourner à la fois P et Q et aussi une autre matrice T à ma fonction principale.retourner plusieurs matrices en C++ (bibliothèque Armadillo)

#include <iostream> 
#include <armadillo> 
using namespace std; 
using namespace arma; 
double phi(int n, int q){ 
... 
    mat P(n,n); 
    P=... 
    mat Q,R; 
    qr(Q,R,P); 
return P: 
return Q; 
return Q; 
... 
} 

int main() { 
    ... 
    int n,q; 
    cout<<"Enter the value of parameters n and q respectively:"<<endl; 
    cin>> n>>q; 
    phi(n,q); 
... 
} 

Je cherche une méthode pour revenir ces matrices dans tatou à l'aide des pointeurs et references.Here mes matrices sont énormes et sont généralement 500 * 500 ou 1000 * 1000. Est-ce que quelqu'un a la solution? Merci d'avance

+1

Pourquoi ne pas changer la signature du phi pour inclure deux pointeurs sur P et Q et les passer de main? – 16tons

+0

Je veux utiliser la fonction phi dans RCPP. Je ne suis pas sûr que cela fonctionne correctement là. Si je ne pouvais pas trouver une autre solution, je dois utiliser des pointeurs. – Ham82

+0

Vous pouvez utiliser un 'std :: tuple' avec' std :: tie', voir http://fr.cppreference.com/w/cpp/utility/tuple – Jonas

Répondre

7

Voici un exemple en utilisant std::tuple avec std::tie

#include <iostream> 
#include <armadillo> 

using namespace arma; 

std::tuple<mat, mat> phi(int const n, int const q) 
{ 
    ... 
    mat P(n, n); 
    P = ... 
    mat Q, R; 
    qr(Q, R, P); 
    return std::make_tuple(P, Q); 
} 

int main() 
{ 
    ... 
    int n, q; 
    std::cout << "Enter the value of parameters n and q respectively:" << std::endl; 
    std::cin >> n >> q; 
    mat P, Q; 
    std::tie(P, Q) = phi(n,q); 
    ... 
} 

Avec 17 C++ (et une déclaration structured binding), vous pouvez le faire comme ceci:

#include <iostream> 
#include <armadillo> 

using namespace arma; 

std::tuple<mat, mat> phi(int const n, int const q) 
{ 
    ... 
    mat P(n, n); 
    P = ... 
    mat Q, R; 
    qr(Q, R, P); 
    return {P, Q}; 
} 

int main() 
{ 
    ... 
    int n,q; 
    std::cout << "Enter the value of parameters n and q respectively:" << std::endl; 
    std::cin >> n >> q; 
    auto [P, Q] = phi(n,q); 
    ... 
} 
+0

Merci beaucoup, cela fonctionne correctement. – Ham82