2011-11-13 14 views
5

私は、そのパラメータの1つとしてstd :: vectorをとるメソッドを持っています。行列にstd :: vectorを代入して行列を初期化する方法はありますか?ここで私が以下にしようとしたことがあります。誰も私は行列にベクトル(または倍精度のポインタ)を割り当てることを達成する方法を知っていますか?前もって感謝します。空、コピー、および行と列の数の2 size_typesを取って1:マイク・std :: vectorまたは配列でブースト行列を初期化する

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

マトリックスが2次元構造であり、ベクトルは1であります三次元構造である。ベクトルを検査することによって、行列の正しい次元をどのように決定するのですか? – Mankarse

答えて

3

boost matrix documentationによると、3つのマトリックスクラスのコンストラクタがあります。 boostはそれを定義していないので(多分それを行う方法はたくさんあり、他のすべてのクラスへの変換を定義するクラスはありません)、変換を定義する必要があります。

これは私が使用するアプローチですが、これを行う方法は複数あり、どのようにしてこの問題を解決するかは指定していないため、状況に応じて異なるアプローチを見つけることができます。

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()]; 
     } 
    } 
} 

ご提供されたコードについてのメモのカップル:のstd ::ベクトルは、テンプレート引数を必要とし、あなたはそれのコンストラクタへの行列と入力引数としてmを宣言しています。ここ

3

は、これを行う方法のさらに別の例である:

#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

より便利な方法は次のようである:

matrix<double> m(m*n); 
std::copy(v.begin(), v.end(), m.data().begin()); 
関連する問題