2011-11-13 11 views
5

Mam metodę, która pobiera std :: vector jako jeden z jego parametrów. Czy istnieje sposób inicjalizacji macierzy poprzez przypisanie wektora std :: do macierzy? Oto co próbowałem zrobić poniżej. Czy ktoś wie, w jaki sposób mogę uzyskać przypisanie wektora (lub nawet wskaźnika podwójnego) do macierzy? Z góry dziękuję. MikeInicjowanie macierzy doładowania za pomocą std :: vector lub array

void Foo(std::vector v) 
{ 
    matrix<double> m(m, n, v); 
    // work with matrix... 
} 
+1

Matryca jest dwuwymiarowa struktura, wektor jest jeden struktura wymiarowa. W jaki sposób planujesz określić prawidłowe wymiary matrycy, sprawdzając wektor? – Mankarse

Odpowiedz

3

Według boost matrix documentation istnieją 3 konstruktorów dla klasy matrycy: pusty, kopiowanie i jeden biorąc dwa size_types na liczbę wierszy i kolumn. Ponieważ boost nie definiuje go (prawdopodobnie dlatego, że istnieje wiele sposobów na to, a nie każda klasa jest w stanie zdefiniować konwersję na każdą inną klasę), będziesz musiał zdefiniować konwersję.

Oto podejście, którego bym użył, ale ponieważ istnieje wiele sposobów, aby to zrobić, a pytanie nie określa, w jaki sposób chcesz to zrobić, możesz znaleźć inne podejście, które będzie bardziej pasowało do Twojej sytuacji.

void Foo(const std::vector<double> & v) { 
    size_t m = ... // you need to specify 
    size_t n = ... // you need to specify 

    if(v.size() < m * n) { // the vector size has to be bigger or equal than m * n 
     // handle this situation 
    } 

    matrix<double> mat(m, n); 
    for(size_t i=0; i<mat.size1(); i++) { 
     for(size_t j=0; j<mat.size2(); j++) { 
     mat(i,j) = v[i+j*mat.size1()]; 
     } 
    } 
} 

Kilka uwag na temat swojej przewidzianej kodu: std :: vector potrzebuje szablonie argumentu i jesteś uznającej m jako matryca i argumentu wejściowego do jego konstruktora.

3

Oto kolejny przykład tego, jak można to zrobić:

#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; 
} 
1

Bardziej wygodnym sposobem jest tak:

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