我在很多示例/教程中已经注意到人们使用大括号运算符“()”来进行矩阵访问,这在某些情况下会让我感到困惑。我们假设我们有一个名为M.的矩阵(例如3x4),通过“M(0)”或“M(1)”访问它将返回哪些元素,或大括号内的任何其他奇异参数?我以为你应该指定行和列(如“M(0,1)”或类似的东西)。opencv矩阵大括号运算符
2
A
回答
0
这是来自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];
}
4
你看到的是线性索引访问 - 即直接以线性方式访问内存。
在一个矩阵中,所有元素都存储在一个大的内存块中,每行都在前一个之后。这就是为什么,如果你想在的位置(i, j)
你写somethink喜欢
elem = matrix(j + rowWidth*i)
访问一个元素,但你可以简单地访问它
elem = matrix(k)
,当你不关心这是非常有用例如,当您总结矩阵中的所有元素时:
count = width*height;
sum=0;
for(i=0;i<count;i++)
sum+=matrix(i);
或者当您有预先计算好的线性指数时。
如果矩阵不会存储在连续的内存块中,例如一个更大矩阵中的感兴趣区域,请注意这种技术可能会产生一些最疯狂的错误。在使用线性索引之前总是检查if (myMat.isContinuous())
!
相关问题
- 1. openCV中矩阵运算的问题
- 2. opencv计算矩阵等级
- 3. 矩阵运算
- 4. 括号中的运算符符号的括号
- 5. MATLAB矩阵运算
- 6. python中巨大矩阵的矩阵运算
- 7. 符号块的矩阵计算在Maple
- 8. 矩阵乘以运算符重载
- 9. 尝试超载*运算符的矩阵
- 10. 不工作矩阵运算符+重载
- 11. 矩阵运算符* = C++返回错误
- 12. C++运算符()括号 - 运算符类型()与类型运算符()
- 13. C++运算符为具有实矩阵和复矩阵的矩阵类重载
- 14. 在括号前面展开运算符?
- 15. 括号内的运算符优先级
- 16. 重载的括号运算符
- 17. std :: list的重载括号运算符
- 18. C++运算符()括号重载
- 19. 布尔运算符和括号
- 20. 带括号和不带括号的运算符的地址
- 21. 在OpenCV中使用子矩阵制作一个大矩阵
- 22. MongoDb逻辑查询运算符和大括号
- 23. 矩阵运算C++运算符重载程序错误
- 24. 使矩阵乘法运算符@为numpy中的标量运算
- 25. 如何过载运算符矩阵运算使用VB.net编码
- 26. 更好库矩阵运算
- 27. NumPy的矩阵运算
- 28. 红宝石矩阵运算
- 29. 矩阵运算MATLAB走动
- 30. C++矩阵运算效率
你能指出,使用的一个例子继承? – Mohammad 2012-07-30 05:21:46
'Mat_ X(4,1); (4,1); Mat_ X_(4,1); (...) // A是4x3矩阵,B是4x1矩阵cv :: solve(A,B,X_,DECOMP_SVD); X(0)= X_(0); X(1)= X_(1); X(2)= X_(2); X(3)= 1.0;' –
dumpy
2012-07-31 17:12:13