boost库中的矩阵赋值如何与括号一起使用?

时间:2018-04-08 03:13:49

标签: c++ matrix boost assign ublas

来自Boost official site的示例代码:

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

int main () {
    using namespace boost::numeric::ublas;
    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 << m << std::endl;
}

我对m (i, j) = 3 * i + j;感到困惑,因为m是一个对象,并且将类和参数组合在一起的唯一情况是构造函数,但在那里,显然不是。

我是C ++的初学者。但是,与Ruby不同的是,C ++中很少有技巧。

为了深入发现C ++,有没有人可以原则上给我解释一下?

1 个答案:

答案 0 :(得分:1)

在C ++中,您可以定义自己的运算符(如果需要,可以覆盖它们)。一个受欢迎的访问者运算符是[]。但是,()也适用于自定义运算符。

如果你看一下Boost中matrix.hpp的源代码,其中定义了matrix对象,确实有一个运算符()

/** Access a matrix element. Here we return a const reference
 * \param i the first coordinate of the element. By default it's the row
 * \param j the second coordinate of the element. By default it's the column
 * \return a const reference to the element
 */
    BOOST_UBLAS_INLINE
    const_reference operator () (size_type i, size_type j) const {
        return data () [layout_type::element (i, size1_, j, size2_)];
    }

/** Access a matrix element. Here we return a reference
 * \param i the first coordinate of the element. By default it's the row
 * \param j the second coordinate of the element. By default it's the column
 * \return a reference to the element
 */
    BOOST_UBLAS_INLINE
    reference operator () (size_type i, size_type j) {
        return at_element (i, j);
    }

    // Element assignment

Boost机制的低级实现在第一次看起来可能有点复杂,但允许它具有这样的语法的原因是定义中存在operator ()

您可以查看有关运算符的更简单示例,例如there(在cppreference上)。