8
votes

Initialisation de la matrice de boost avec un std :: vecteur ou tableau

J'ai une méthode qui prend un std :: vecteur comme l'un de ses paramètres. Y a-t-il une façon de pouvoir initialiser une matrice en attribuant le STD :: Vecteur de la matrice? Voici ce que j'ai essayé de faire ci-dessous. Est-ce que quelqu'un sait comment je peux obtenir l'attribution du vecteur (ou même un pointeur de doubles) à la matrice? Merci d'avance. Mike XXX


1 commentaires

Une matrice est une structure en deux dimensions, un vecteur est une structure unidimensionnelle. Comment envisagez-vous de déterminer les bonnes dimensions pour la matrice en inspectant le vecteur?


4 Réponses :



6
votes

Voici encore un autre exemple de la manière dont cela peut être fait:

#include <algorithm>
#include <vector>
#include <boost/numeric/ublas/storage.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

namespace ublas = boost::numeric::ublas;

template <typename T, typename F=ublas::row_major>
ublas::matrix<T, F> makeMatrix(std::size_t m, std::size_t n, const std::vector<T> & v)
{
    if(m*n!=v.size()) {
        ; // Handle this case
    }
    ublas::unbounded_array<T> storage(m*n);
    std::copy(v.begin(), v.end(), storage.begin());
    return ublas::matrix<T>(m, n, storage);
}

int main () {;
    std::vector<double> vec {1, 2, 3, 4, 5, 6};
    ublas::matrix<double> mm = makeMatrix(3,2,vec);
    std::cout << mm << std::endl;
}


0 commentaires

4
votes

Un moyen plus pratique est comme ceci:

matrix<double> m(m*n);
std::copy(v.begin(), v.end(), m.data().begin());


0 commentaires

1
votes

Réponse simple, mais pas très apparent de la documentation de boost.

Vous pouvez simplement utiliser std :: vecteur <> comme type de paramètre de modèle de tableau de stockage au lieu de défaut sans bordure_array <> pour votre matrice. (Il est mentionné dans la note de bas de page 2 de la documentation sur matrice <> classe.) xxx

Plus de variantes d'initialisation peuvent être trouvées dans votre source de boost: Boost / Libs / numérique / Ublas / Doc / Samples / Assignment_Examples.cpp , comme indiqué ici: Attribuer Plusieurs valeurs à booster :: Numérique :: Ublas :: Vecteur en C ++

ou ici: Exemples Ublas , exemple 3, qui est mentionné par la question connexe: Ublas: envelopper Ublas :: Vecteur comme Ublas :: matrix_expression


0 commentaires