2011-12-05 8 views
2

私はBOOST uBLASベクターのコンストラクタの動作を変更しようとしており、これを実行する最良の方法が何であるか不思議でした。私は、例えば、コンストラクタを使用して、2次元ベクトルの成分(座標)を初期化したい:ブーストベクトルのコンストラクタを変更する

代わりの:

typedef boost::ublas::vector BoostVector; 

double x=1; 
double y=0.7; 

BoostVector<double> v(2); 
v(1) = x; v(2) = y; //x and y are vector components/co-ordinates 

Iコンストラクタでxとyを指定できるようにしたいです。

BoostVector<double> v(x,y); 

私が含有又はブーストベクトルクラスから継承することのいずれか、これを行うためのインタフェースを提供する新しいクラスを作成することができます考えていますが、私はC++にかなり新たなんだと私はわからないんだけどブーストベクトルの機能を保持する最善の方法を説明します。特に、私はuBLASベクタークラスで使用されるテンプレートの発現の最適化を妨げたくありません。これに関するアドバイスは非常に高く評価されます。 ありがとう、 キリアン

答えて

0

2Dは多次元配列か2つの座標ですか?私はあなたがが、xとyで何を意味するかわからないんだけど、この場合

vector<vector<type>> v; 

:多次元場合は、ベクトルのベクトルを使用します。

template <class T> 
class Vector2 
{ 
public: 
    Vector2(const T& x, const T& y) : mX(x), mY(y) {} 

private: 
    T x; 
    T y; 
}; 

私は傾向がある理由:2点の座標は(X軸、Y軸)、私はこのような何かをしたい場合

v[1] = xなど:そして、()オペレータではなく、[]演算子を使用します既存のstd :: vectorを使用するのではなく、独自のVector2クラスを作成するのは、格納しているすべてが2つの値であれば、使用しないオーバーヘッドを取り除くためです。これには、ダイナミックメモリの割り当て、配列の長さの格納などが含まれます。実行しているすべてが2つの値を格納している場合は、そのすべてを必要としません。

+0

返信いただきありがとうございます。私は2つの座標を持つような2Dを意味しました。私はすでにあなたに似たVector2クラスを作成しました。数学的演算のためのメソッドのロード(ドットプロダクトなど)があります。しかし、これらの操作の多くを、見た目で一時的なものが作成されているため、一緒にストリングすると、実際には効率が悪いことが分かりました。これが私がBOOST uBLASベクトルの使用に切り替えることを試みている理由です。私が抱えている問題は、あなたの提案にあるようなuBLASベクターに構築されたコンストラクタがないことです。'Vector2(const T&x、const T&y):mX(x)、mY(y){}' – kieranhood

0

猫肌にする多くの多くのの方法があります。

  1. はあなたがC++ 0xの均一な初期化子を探しています:

    std::vector<type> v { x, y }; 
    
  2. あるいは単なる古いC++ 03 :

    type arr[] = { x,y }; 
    std::vector<type> v(arr, arr+2); 
    
  3. クラスウィット

    std::tuple<type, type> point(x,y); 
    

    タプルはTR1、C++ 0Xでブーストしている:H構造体のような挙動は、タプルを使用します。彼らは上記のすべての不在で


(STD ::ペア、のstd ::少ないなどとの自動相互運用性のような)気の利いた機能のすべての種類を持って、慣用的になり、次の

typedef std::pair<type, type> point_t; 

point_t p(x,y); 
0

2Dベクトルを大量に扱い、uBLASを使用する場合、いくつかの便利な機能を導入することは妥当かもしれません。あなたが固定サイズのベクトルで作業しているときところで、それが(スタック上)bounded_arrayストレージを使用する方が効率的だ

私は(どれも理想的ではない、std::initialization_listと互換性uBlasを持っていいだろう)次の解決策を考えた:

// Assignment: 
#include <boost/numeric/ublas/assignment.hpp> 
ublas::bounded_vector<double,2> v1; 
v1 <<= 1.1, 2.1; // syntactic sugar over plain assignment 

// Use a helper 
template<typename T> 
ublas::vector<T> makeVector2(T x1, T x2) 
{ 
    ublas::bounded_vector<T,2> res; // I 
    res <<= x1, x2; // or plain res(0)=x1; res(1)=x2; 
    return res; 
} 
ublas::vector<double> v1 = makeVector2<double>(1,2.2); 

// Use an `evil' conversion-helper (or it's templatized variant) 
class Foo { 
public: 
    Foo(double x1, double x2) : m_x1(x1), m_x2(x2) {} 
    operator ublas::vector<double>() { return makeVector2(m_x1, m_x2); }; 
private: 
    double m_x1, m_x2; 
}; 
ublas::vector<double> v3(Foo(1.3,2.3)); 

最後にExample 3をご覧ください。

関連する問題