2011-11-14 5 views
11

나는 많은 양의 과학적 프로그래밍을하고 있으며 Boost.Units와 함께 매우 좋은 경험을했다. 단위 시간당 대량의 태그를 따라서 고전적 물리적 차원 분석으로 많은 오류를 포착하고 선형 대수학에 Eigen 2를 사용합니다.선형 대수 라이브러리를 Boost :: Units와 결합하기

그러나 Eigen에는 단위 개념이 없으며 Eigen에 대한 행렬에서 스칼라 수량을 설정할 수 있지만 두 수량의 곱셈은 동일한 유형을 산출 할 것으로 예상됩니다. 이는 분명히 단위에 대해서는 사실이 아닙니다. 예를 들어, 같은 코드 :

using boost::units::quantity; 
namespace si = boost::units::si; 
Eigen::Matrix< quantity<si::length>, 2, 1 > meter_vector; 
quantity<si::area> norm = meter_vector.squaredNorm(); 

은 논리적으로 올바른 경우에도 작동하지 않습니다.

단위를 지원하는 매트릭스 라이브러리가 있습니까? 나는 이것이 과거에 구현하기가 아주 어렵다는 것을 잘 알고 있었으며, C++ 11과 decltype을 사용하면 훨씬 쉬워 질 것입니다. 그러나 C++ 03과 템플릿 전문화는 가능했습니다. http://eigen.tuxfamily.org/dox-devel/TopicCustomizingEigen.html

아이겐는 기본 데이터 유형 이외의 사용하는 몇 가지 작업이 필요하지만 일반적으로 가능 :

답변

7

저는 Blitz ++가 Boost.Units 기능의 대부분을 지원한다고 생각합니다. 영업에 의해

편집 :

#include <blitz/array.h> 
#include <boost/units/systems/si/area.hpp> 
#include <boost/units/systems/si/length.hpp> 
#include <boost/units/quantity.hpp> 

using boost::units::quantity; 
namespace si = boost::units::si; 

namespace blitz { 
template< typename U1, typename T1, typename U2, typename T2> 
struct Multiply< quantity<U1,T1>, quantity<U2,T2> > 
{ 
    typedef typename boost::units::multiply_typeof_helper< quantity<U1,T1>, quantity<U2,T2> >::type T_numtype; 

    static inline T_numtype apply(quantity<U1,T1> a, quantity<U2,T2> b) { return a*b; } 
}; 

} 

using namespace blitz; 

int main() { 
    Array< quantity<si::length>, 1 > matrix; 
    Array< quantity<si::area>, 1 > area; 
    area = matrix * matrix; 
    return 0; 
} 
+0

기록을 위해 나 자신을 조금씩 검색해야했기 때문에 [The blitz manual 3.7.1] (http://www.oonumerics.org/blitz/docs/blitz_3.html#SEC90)은 사용자를 홍보하는 방법을 알려줍니다 정의 된 유형. 힌트를 가져 주셔서 감사합니다. – thiton

1

는이 위키 페이지를 확인해야합니다.

+2

힌트를 보내 주셔서 감사합니다. 페이지를 읽고 힌트를 따라야했습니다. 요점은 연산자 +가 정상적으로 작동하지만 예를 들어 연산자 *는 잘못되었습니다. 미터 * 미터는 미터가 아니기 때문입니다. – thiton

0

표준 아이겐 라이브러리 플러그인 옵션을 사용의 어려움이 있다는 것입니다 : 여기에 참고로 나는 블리츠의 행렬 곱셈 기능을 테스트있는 전체 테스트 코드는 Boost Units 수량을 사용하려면 기존 연산자 +, -, * 등을 교체해야합니다. 반환 형식이 동일하지 않습니다 방법

template<class X,class Y> 
CUSTOM_TYPE<typename boost::units::multiply_typeof_helper<X,Y>::type> 
operator*(const CUSTOM_TYPE<X>& x,const CUSTOM_TYPE<Y>& y) 
{ 
    typedef typename boost::units::multiply_typeof_helper<X,Y>::type type; 

    return CUSTOM_TYPE<type>(...); 
} 

공지 사항 : 부스트 장치는 사용자 임의의 CUSTOM_TYPE를 들어, * 곱셈 연산자와 함께 작동하도록 입력에 대한 예를 들어

은,이 같이 필요 입력 형 여기서 템플릿 헬퍼 multiply_typeof_helper를 사용하여 반환 유형을 만듭니다. 미터를 초 단위로 곱하면 양 단위를 얻을 수 없기 때문입니다. 그러나 기본 Eigen * 연산자는 입력과 동일한 "유형"을 반환합니다. 이것이 문제입니다.

다른 옵션은 행렬 내부에 수량을 포함하는 대신 수량 내부에 고유 행렬을 포함시키는 것입니다.