2010-04-02 70 views
4

如何創建常量提升矩陣?如何創建const boost矩陣?

下不工作:

const boost::numeric::ublas::matrix<double> arrayM(1, 3) = { {1.0, 2.0, 3.0} }; 
+0

它不起作用,因爲您聲明瞭一個常量矩陣,然後嘗試使用可變賦值運算符爲其分配值。以下GMan的解決方案將滿足您的需求。 – 2010-04-02 22:48:09

+0

我應該清楚我的問題: 有沒有一種方法可以用類似的方式創建它,我們創建一個常量數組? 例如: int billy [5] = {16,2,77,40,12071}; – 2010-04-02 22:51:25

回答

8

通常以一個類似於:

typedef boost::numeric::ublas::matrix<double> matrix_type; 

const matrix_type get_matrix(void) 
{ 
    matrix_type result(1, 3); 
    result(0, 0) = 1; 
    result(0, 1) = 2; 
    result(0, 2) = 3; 

    return result; 
} 

const matrix_type arrayM = get_matrix(); 

你也可以嘗試這樣的事情(主要是未經測試):

#include <boost/numeric/ublas/matrix.hpp> 
#include <boost/numeric/ublas/io.hpp> 

template <typename T, typename L = boost::numeric::ublas::row_major, 
      typename A = boost::numeric::ublas::unbounded_array<T> > 
class matrix_builder 
{ 
public: 
    // types 
    typedef boost::numeric::ublas::matrix<T, L, A> matrix_type; 
    typedef typename matrix_type::size_type size_type; 

    // creation 
    matrix_builder(size_type pRows, size_type pColumns) : 
    mMatrix(pRows, pColumns), 
    mRow(0), 
    mColumn(0) 
    {} 

    matrix_builder& operator()(const T& pValue) 
    { 
     mMatrix(mRow, mColumn) = pValue; 
     if (++mColumn == mMatrix.size2()) 
     { 
      mColumn = 0; 
      mRow++; 
     } 

     return *this; 
    } 

    // access 
    operator const matrix_type&(void) const 
    { 
     return mMatrix; 
    } 

private: 
    // non copyable 
    matrix_builder(const matrix_builder&); 
    matrix_builder& operator=(const matrix_builder&); 

    // members 
    matrix_type mMatrix; 
    size_type mRow; 
    size_type mColumn; 
}; 

typedef boost::numeric::ublas::matrix<double> matrix_type; 

static const matrix_type m1 = matrix_builder<double>(3, 1) 
           (1)(2)(3); 

static const matrix_type m2 = matrix_builder<double>(3, 3) 
           (1)(2)(3) 
           (4)(5)(6) 
           (7)(8)(9); 

int main(void) 
{ 
    std::cout << m1 << std::endl; 
    std::cout << m2 << std::endl; 
} 

相同的想法,更通用。還有一點更直觀,可以很好。

+0

儘管這有效,但我會爲每個需要創建的常量矩陣類型創建一個函數。 – 2010-04-02 22:48:20

+2

@Venkata:我現在寫一個更通用的方法。 – GManNickG 2010-04-02 22:53:07

+0

+1不錯的一個GMan! – StackedCrooked 2010-04-02 23:43:42