2014-06-24 2 views
2

Согласно this page должна быть sum функция, обеспечиваемая в ublas, но я не могу получить следующие компиляции:Как суммировать все элементы в 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> 

Я пропустил включить, или я неправильно понял документы? Как бы мне это достичь (я пытаюсь подвести все элементы матрицы и создать один 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 сделал.

Смежные вопросы