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)
まぁ仕方ないんですけど、でも、そうなると初期化時に
boost::numeric::ublas::c_vector<double, 2> vec;
vec(0) = 0;
vec(1) = 0;
とかしなきゃいけなくなります。ということは、そう、constにできないんですよね。
const boost::numeric::ublas::c_vector<double, 2> vec;
vec(0) = 0; // ←できない
vec(1) = 0; // ←できない
list_ofとか使えればなんとかなるかなぁと試行錯誤したんですが、ダメでした。
一応、stackoverflowにも質問が上がってましたけど、結局constにできなさそうでした。
ので、仕方ないので、こんな力技で解決しました。
// 次元数
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);
もっと良い解決方法ないものか・・・ご存知のかた教えて下さい。