LoginSignup
6
6

More than 5 years have passed since last update.

boost::numeric::ublas::c_vectorでconstなゼロベクトルを作る方法

Last updated at Posted at 2014-01-28

C++で2次元あるいは3次元ベクトル使う時って、boost::numeric::ublas::c_vectorを使いますよね。

・・・使いませんか?

私はuBLASとかViennaCLとか使いたいので、使いたいんですよ!
というか、C++用の線形代数ライブラリっていくつかありますけど、boostないC++なんてこの世に存在してはいけないので、逆に言えばuBLASとかC++ではなにもしなくても使えるもののはずなんです!

と、話が逸れましたが本題。

このboost::numeric::ublas::c_vectorって、普通のboost::numeric::ublas::vectorとは違って、配列(array)ベースのベクトルで、サイズを固定で作れるのでN次元のサイズ固定ベクトルのために重宝してるんです。
ただ、コンストラクタが貧弱なんですよね。

  • 引数なし(値不定):c_vector()
  • サイズ指定(Nがあるのになにに使うの?):c_vector(size_type size)
  • コピーコンストラクタ:c_vector(const c_vector &v)
  • vector_expression指定:c_vector(const vector_expression< AE > &ae)

まぁ仕方ないんですけど、でも、そうなると初期化時に

normalConstruct.cpp
boost::numeric::ublas::c_vector<double, 2> vec;
vec(0) = 0;
vec(1) = 0;

とかしなきゃいけなくなります。ということは、そう、constにできないんですよね。

constConstruct_NG.cpp
const boost::numeric::ublas::c_vector<double, 2> vec;
vec(0) = 0; // ←できない
vec(1) = 0; // ←できない

list_ofとか使えればなんとかなるかなぁと試行錯誤したんですが、ダメでした。

一応、stackoverflowにも質問が上がってましたけど、結局constにできなさそうでした。

ので、仕方ないので、こんな力技で解決しました。

constVector_OK.cpp

// 次元数
const int DIM = DIMENSTION;

// N次元固定ベクトル
typedef boost::numeric::ublas::c_vector<double, DIM> Vector;

// 定数ベクトル
class VectorConst : public Vector
{
public:
    VectorConst(const double& value)
    {
        std::fill_n(this->begin(), DIM, value);
    }
};

// ゼロベクトル
const Vector VectorZero = VectorConst(0.0);

もっと良い解決方法ないものか・・・ご存知のかた教えて下さい。

6
6
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6