2017-01-17 4 views
5

Я работаю с библиотекой Armadillo на C++. Сначала я вычисляю специальную матрицу (в моем коде: P), затем вычисляю QR-разложение (в моем коде: Q). В конце мне нужно вернуть как P, так и Q, а также другую матрицу T в мою основную функцию.вернуть несколько матриц в C++ (библиотека Армадилло)

#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); 
... 
} 

Я ищу способ, чтобы вернуть эти матрицы в броненосца с использованием указателей отказа и references.Here мои матрицы огромны, и, как правило, 500 * 500 или 1000 * 1000. У кого-нибудь есть решение? Благодаря заранее

+1

Почему бы не изменить подпись фи, чтобы включить два указателя в P и Q и передать их из основного? – 16tons

+0

Я хочу использовать функцию phi в RCPP. Я не уверен, что он работает правильно. Если бы я не нашел другого решения, я должен использовать указатели. – Ham82

+0

Вы можете использовать 'std :: tuple' вместе с' std :: tie', см. Http://en.cppreference.com/w/cpp/utility/tuple – Jonas

ответ

7

Ниже приведен пример использования std::tuple вместе с 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); 
    ... 
} 

С C++ 17 (и structured binding декларации) вы могли бы сделать это следующим образом:

#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

Спасибо, много работает. – Ham82

Смежные вопросы