boost库中的矩阵赋值如何与括号一起使用?
How can matrix assignment in boost library work with parenthesis?
来自 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 是一个对象,并且将 class 和参数组合在一起的唯一情况是构造函数,但显然不是。
我是C++的初学者。然而,与 Ruby 不同的是,C++ 中的技巧很少。
为了对C++有更深的探索,有哪位大神能给个原理上的解释吗?
在 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 上)。
来自 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 是一个对象,并且将 class 和参数组合在一起的唯一情况是构造函数,但显然不是。
我是C++的初学者。然而,与 Ruby 不同的是,C++ 中的技巧很少。
为了对C++有更深的探索,有哪位大神能给个原理上的解释吗?
在 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 上)。