我已经评估过1×1矩阵的多个矩阵表达式。我想做点什么:
cv::Mat a = cv::Mat(n, m, CV_64F), b = ..., c = ...
double d = a.t() * b * c.inv(); // result happens to be 1 x 1 matrix
我发现这样做的方法是写:
double d = ((cv::Mat)(a.t() * b * c.inv())).at<double>(0);
这有点长且非常令人困惑,特别是如果涉及长表达式。
有没有更好,更清晰的方式来写这个?我可以以某种方式重载操作符double
仅适用于1x1
cv::MatExpr
的?
修改
这样做的简单功能当然是可能的,虽然很难看。更优雅的解决方案?
double toDouble(cv::MatExpr M) {
cv::Mat A = M;
if (A.rows != 1 || A.cols != 1) throw "Matrix is not 1 by 1!";
return A.at<double>(0);
}
答案 0 :(得分:5)
您可以做的是使用cv::Mat::dot
函数(documentation link),该函数需要两个cv::Mat
相同的大小并返回一个double。
如果您的操作结果是1x1矩阵,那么您应该能够使用cv::Mat::dot
来表达它。例如,如果a和b是nx1,则以下两行是等效的:
double d = ((cv::Mat)(a.t() * b)).at<double>(0);
double d = a.dot(b);
人们还可以想象更复杂的操作:
double d = (M.t()*U.inv()*a).dot(V.inv()*b);