8

パラメータの1つとしてstd::vectorを使用するメソッドがあります。std :: vectorをマトリックスに割り当てることでマトリックスを初期化する方法はありますか?これが私が以下でやろうとしたことです。ベクトル(またはdoubleのポインター)をマトリックスに割り当てる方法を知っている人はいますか?前もって感謝します。マイク

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

4 に答える 4

6

これを行う方法のさらに別の例を次に示します。

#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;
}
于 2012-04-20T18:50:25.557 に答える
4

ブースト マトリックスのドキュメント によると、マトリックス クラスには 3 つのコンストラクターがあります。ブーストはそれを定義していないので (おそらくそれを行う方法はたくさんあり、すべてのクラスが他のすべてのクラスへの変換を定義するわけではないため)、変換を定義する必要があります。

これが私が使用するアプローチですが、これを行うには複数の方法があり、質問ではこれをどのように行うかが指定されていないため、状況により適した別のアプローチが見つかる場合があります。

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::vector にはテンプレート化された引数が必要でありm、行列およびそのコンストラクターへの入力引数として宣言しています。

于 2011-11-13T05:04:09.930 に答える
4

より便利な方法は次のとおりです。

matrix<double> m(m*n);
std::copy(v.begin(), v.end(), m.data().begin());
于 2015-08-12T04:21:21.153 に答える