Question Comment convertir une matrice de tatou en vecteur de vecteurs?


J'ai créé une matrice armadillo c ++ comme suit:

arma::mat A; 
A.zeros(3,4);

Je veux le convertir en un vecteur de vecteurs défini par

std::vector< std::vector<double> > B(3, std::vector<double>(4) ); 

Comment définir B pour égaler A? S'il n'y a pas de moyen facile pour un vecteur de vecteurs, qu'en est-il d'un tableau de tableaux, à savoir, si je définissais B comme

double B[3][4]; 

11
2018-03-16 23:35


origine


Réponses:


Dans de tels cas, vous devez utiliser arma::conv_to ce qui est une caractéristique totalement superbe d'arma.

Notez que cette méthode nécessite un objet source pour pouvoir être interprété comme un vecteur. C'est pourquoi nous devons le faire de manière itérative pour chaque ligne. Voici une méthode de conversion:

#include <armadillo>

typedef std::vector<double> stdvec;
typedef std::vector< std::vector<double> > stdvecvec;

stdvecvec mat_to_std_vec(arma::mat &A) {
    stdvecvec V(A.n_rows);
    for (size_t i = 0; i < A.n_rows; ++i) {
        V[i] = arma::conv_to< stdvec >::from(A.row(i));
    };
    return V;
}

Et voici un exemple d'utilisation:

#include <iomanip>
#include <iostream>

int main(int argc, char **argv) {
    arma::mat A = arma::randu<arma::mat>(5, 5);
    std::cout << A << std::endl;

    stdvecvec V = mat_to_std_vec(A);
    for (size_t i = 0; i < V.size(); ++i) {
        for (size_t j = 0; j < V[i].size(); ++j) {
            std::cout << "   "
                << std::fixed << std::setprecision(4) << V[i][j];
        }
        std::cout << std::endl;
    }
    return 0;
}

std::setprecision utilisé pour générer une sortie plus lisible:

0.8402   0.1976   0.4774   0.9162   0.0163
0.3944   0.3352   0.6289   0.6357   0.2429
0.7831   0.7682   0.3648   0.7173   0.1372
0.7984   0.2778   0.5134   0.1416   0.8042
0.9116   0.5540   0.9522   0.6070   0.1567

0.8402   0.1976   0.4774   0.9162   0.0163
0.3944   0.3352   0.6289   0.6357   0.2429
0.7831   0.7682   0.3648   0.7173   0.1372
0.7984   0.2778   0.5134   0.1416   0.8042
0.9116   0.5540   0.9522   0.6070   0.1567

En avoir un bon!


11
2018-03-26 17:52