2014-06-24 48 views
2

this page應該有ublas提供sum功能,但我不能讓下面的編譯:如何求和ublas矩陣中的所有元素?

boost::numeric::ublas::matrix<double> mymatrix; 
std::cout << boost::numeric::ublas::sum(mymatrix); 

錯誤是:

testcpp:146:144: error: no matching function for call to ‘sum(boost::numeric::ublas::matrix&)’

#include ING:

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

我錯過了一個include,還是我誤解了文檔?我將如何實現這一點(我試圖總結一個矩陣的所有元素,併產生一個單一的double)?

+0

該一元和是一個矢量而不是矩陣表達式。瑣碎的同構M_m,n≅R ** {m * n}似乎被排除在外。對能見度不太確定,但我認爲你可以到達底層(平面)容器。然後你可以使用例如std :: partial_sum就可以了。 – Solkar

回答

2

正如在評論中指出,sum僅適用於矢量(see documentation

你一定可以得到在m.data(),總結這樣的價值觀,但你用的是線性代數庫!通過你的矩陣乘法的1的行向量,總結結果:

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

namespace bls = boost::numeric::ublas; 
int main() 
{ 
    bls::matrix<double> m(3, 3); 
    for (unsigned i = 0; i < m.size1(); ++i) 
     for (unsigned j = 0; j < m.size2(); ++j) 
      m(i, j) = 3 * i + j; 

    std::cout << "Sum of all elements of " << m << " is " 
      << sum(prod(bls::scalar_vector<double>(m.size1()), m)) << '\n'; 
} 

更可重複使用的方法是定義一個sum接受一個matrix_expression,爲shark library一樣。