【问题标题】:How do I sum all elements in a ublas matrix?如何对 ublas 矩阵中的所有元素求和?
【发布时间】:2014-06-24 23:41:43
【问题描述】:

根据this page应该有ublas中提供的sum函数,但是我无法编译如下:

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

错误是:

testcpp:146:144:错误:没有匹配的函数调用 'sum(boost::numeric::ublas::matrix&)'

我是#includeing:

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

我错过了包含,还是我误解了文档?我将如何实现这一点(我正在尝试总结矩阵的所有元素并生成单个 double)?

【问题讨论】:

  • 那个一元和是一个向量,而不是一个矩阵表达式。平凡的同构 M_m,n ≅ R**{m*n} 似乎被排除在 ansatz 之外。不再确定可见性,但我认为您可以使用底层(平面)容器。然后你可以使用例如std::partial_sum 关于那个。

标签: c++ boost


【解决方案1】:

正如 cmets 中所指出的,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 所做的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 2017-03-05
    相关资源
    最近更新 更多