2011-12-05 3 views
2

나는 부스터 uBLAS 벡터의 생성자 동작을 변경하려고하며 최선의 방법이 무엇인지 궁금해하고있었습니다. 나는 예를 들어, 생성자를 사용하여 2D 벡터의 구성 요소 (좌표)를 초기화 할 대신의부스트 벡터의 생성자 변경

을 :

내가 생성자에서 x와 y를 지정할 수 있도록하려면
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 

. 내가 포함 또는 부스트 벡터 클래스에서 상속하여 중,이 일을위한 인터페이스를 제공하는 새로운 클래스를 만들 수 생각하고 있어요,하지만 난 C에 비교적 새로운 해요 ++와 잘 모르겠어요

BoostVector<double> v(x,y); 

부스트 벡터의 기능을 유지하는 가장 좋은 방법입니다. 특히 uBLAS 벡터 클래스에서 사용하는 템플릿 표현 최적화를 방해하고 싶지 않으므로 특히 그렇습니다. 이것에 대한 조언은 매우 감사하겠습니다. 감사합니다. 키어런

답변

0

2D는 다차원 배열 또는 두 좌표로? 다차원 인 경우 벡터 벡터를 사용하십시오.

vector<vector<type>> v; 

이 경우에는 x와 y의 의미를 모르겠습니다.

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

private: 
    T x; 
    T y; 
}; 

I는 경향 그 이유는 두 개의 좌표 (X 축, Y 축),이 같은 일을 할 경우

v[1] = x 등 : 그리고() 연산자 대신 [] 연산자를 사용 기존 std :: vector를 사용하지 않고 자신 만의 Vector2 클래스를 만드는 것이 중요합니다. 왜냐하면 저장하는 모든 것이 두 개의 값인 경우에는 사용하지 않는 오버 헤드를 없애기 때문입니다. 여기에는 동적 메모리 할당, 배열의 길이 저장 등이 포함됩니다. 수행중인 모든 작업이 두 개의 값을 저장하는 경우 모든 작업이 필요하지 않습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 2 개의 좌표로 2D를 의미했습니다. 나는 이미 당신과 비슷한 Vector2 클래스를 만들었습니다. 수학 연산을위한 메소드로드가있었습니다 (제품 등). 그러나 외모에 의해 임시 직원 (temporaries)이 생겨서 많은 작업을한데 묶는 것이 정말 비효율적이라는 것을 알았습니다. 이것이 내가 BOOST uBLAS 벡터를 사용하려고하는 이유입니다. 내가 겪고있는 문제는 당신의 제안에있는 것과 같은 uBLAS 벡터에 내장 된 생성자가 없다는 것입니다; 'Vector2 (const T & x, const T & y) : mX (x), mY (y) {}' – kieranhood

0

고양이 피부하기 많은 많은 가지 방법이 있습니다 :

  1. 당신이 C + +0 균일 이니셜을 찾고 계십니까 :

    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와 부스트에 있습니다 시간 구조체 같은 행동은 튜플을 사용합니다. 그들은 위의 모든의 누락됩니다에서


(표준 : : 쌍, 표준 : 이하 등으로 자동 상호 운용성 등) 멋진 기능을 모든 종류의 관용적 것 다음

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

point_t p(x,y); 
0

2D 벡터를 많이 사용하고 uBLAS을 사용하려는 경우 몇 가지 편리한 기능을 소개하는 것이 좋습니다.당신은 고정 된 크기 벡터와 함께 작업 할 때 BTW, 그것은 (스택에)

나는 다음과 같은 솔루션 (없음 이상적입니다, std::initialization_list와 호환 uBlas을 가지고 좋을 것이다)의 생각 bounded_array 스토리지를 사용하는 것이 더 효율적입니다 :

// 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을 살펴보십시오.