在许多示例/教程中,我注意到人们使用大括号运算符“()”进行矩阵访问,这在某些情况下使我感到困惑。

问题是:
假设我们有一个名为M的n * m矩阵(例如3x4)。通过“M(0)”或“M(1)”或花括号内的任何其他奇异参数访问它,将返回哪些元素?我认为您应该同时指定行和列(例如“M(0,1)”之类的东西)。

最佳答案

这是来自OpenCV 2.4.2

template<typename _Tp> inline _Tp& Mat_<_Tp>::operator ()(int i0, int i1)
{
    return ((_Tp*)(data + step.p[0]*i0))[i1];
}
template<typename _Tp> inline _Tp& Mat_<_Tp>::operator ()(int i0)
{
    return this->at<_Tp>(i0);
}
template<typename _Tp> inline _Tp& Mat_<_Tp>::operator ()(int i0, int i1, int i2)
{
    return this->at<_Tp>(i0, i1, i2);
}

这是Mat::at(int i0)的定义,Mat_公开继承自Mat
template<typename _Tp> inline const _Tp& Mat::at(int i0) const
{
    if( isContinuous() || size.p[0] == 1 )
        return ((const _Tp*)data)[i0];
    if( size.p[1] == 1 )
        return *(const _Tp*)(data + step.p[0]*i0);
    int i = i0/cols, j = i0 - i*cols;
    return ((const _Tp*)(data + step.p[0]*i))[j];
}

08-25 01:16