TSubMat sub(const TMat &m, Int nrows, Int ncols) { Assert(ncols > 0 && nrows > 0 && nrows <= m.Rows() && ncols <= m.Cols(), "(sub(Mat)) illegal subset of matrix"); TSubMat result(nrows, ncols, m.Cols(), m.Ref()); return(result); }
TSparseMat::TSparseMat(const TMat &m) : row(0) { Int i; SetSize(m.Rows(), m.Cols()); for (i = 0; i < rows; i++) row[i] = m[i]; }
TSubMat sub(const TMat &m, Int top, Int left, Int height, Int width) { Assert(left >= 0 && width > 0 && left + width <= m.Cols(), "(sub(Mat)) illegal subset of matrix"); Assert(top >= 0 && height > 0 && top + height <= m.Rows(), "(sub(Mat)) illegal subset of matrix"); TSubMat result(height, width, m.Cols(), m.Ref() + top * m.Cols() + left); return(result); }
TVec operator * (const TMat &m, const TVec &v) { Assert(m.Cols() == v.Elts(), "(Mat::*v) matrix and vector sizes don't match"); Int i; TVec result(m.Rows()); for (i = 0; i < m.Rows(); i++) result[i] = dot(m[i], v); return(result); }
static void rowSums(TMat<TNumMat> mat, Vec<TNumVec> vec, int nthreads){ if (mat.nrow != vec.len) throw std::invalid_argument("provided vector has invalid length"); int nrow = mat.nrow; int ncol = mat.ncol; #pragma omp parallel num_threads(std::max(1, nthreads)) { std::vector<TNumVec> acc(nrow, 0); TNumVec* accBegin = acc.data(); #pragma omp for schedule(static) nowait for (int col = 0; col < ncol; ++col){ TNumMat* matCol = mat.colptr(col); TNumVec* accIter = accBegin; for (int row = 0; row < nrow; ++row){//this loop should be unrolled... *accIter++ += *matCol++; } } #pragma omp critical { for (int row = 0; row < nrow; ++row){ vec[row] += acc[row]; } } } }
TVec operator * (const TVec &v, const TMat &m) // v * m { Assert(v.Elts() == m.Rows(), "(Mat::v*m) vector/matrix sizes don't match"); TMVec temp(m.Cols(), vl_zero); // accumulate in high precision TVec result(m.Cols()); // return low precision. Int i; for (i = 0; i < m.Rows(); i++) temp += m[i] * v[i]; for (i = 0; i < temp.Elts(); i++) result[i] = temp[i]; return(result); }
void ICLASS_API MSER(TMat m, TVectorOfVectorOfPoint2i ** ex) { std::vector<std::vector<cv::Point> > contours; cv::Mat* mm; mm = m.Mat(); cv::MSER()(*mm, contours); *ex = new TVectorOfVectorOfPoint2i(); for (int i = 0; i < (int)contours.size(); i++) { (*ex)->push_back(TVectorOfPoint2i(contours[i])); } }
bool ExpectFundamentalProperties(const TMat &F, const Mat &ptsA, const Mat &ptsB, double precision) { bool bOk = true; bOk &= F.determinant() < precision; assert(ptsA.cols() == ptsB.cols()); Mat hptsA, hptsB; EuclideanToHomogeneous(ptsA, &hptsA); EuclideanToHomogeneous(ptsB, &hptsB); for (int i = 0; i < ptsA.cols(); ++i) { double residual = hptsB.col(i).dot(F * hptsA.col(i)); bOk &= residual < precision; } return bOk; }
static void colSums(TMat<TNumMat> mat, Vec<TNumVec> vec, int nthreads){ if (mat.ncol != vec.len) throw std::invalid_argument("provided vector has invalid length"); TNumVec* cs = vec.ptr; int nrow = mat.nrow; int ncol = mat.ncol; #pragma omp parallel for schedule(static) num_threads(std::max(1, nthreads)) for (int col = 0; col < ncol; ++col){ TNumMat* ptr = mat.colptr(col); TNumMat tmp = 0; for (int row = 0; row < nrow; ++row){ tmp += *ptr++; } cs[col] = tmp; } }
TMSubVec diag(const TMat &m, Int diagNum) { CheckRange(diagNum, 1 - m.Rows(), m.Cols(), "(row(Mat)) illegal row index"); if (diagNum == 0) return(TMSubVec(Min(m.Rows(), m.Cols()), m.Cols() + 1, m.Ref())); else if (diagNum < 0) return(TMSubVec(Min(m.Rows() + diagNum, m.Cols()), m.Cols() + 1, m.Ref() - diagNum * m.Cols())); else return(TMSubVec(Min(m.Cols() - diagNum, m.Rows()), m.Cols() + 1, m.Ref() + diagNum)); }
TMSubVec row(const TMat &m, Int i) { CheckRange(i, 0, m.Rows(), "(row(Mat)) illegal row index"); return(TMSubVec(m.Cols(), 1, m[i].Ref())); }
TMSubVec col(const TMat &m, Int i) { CheckRange(i, 0, m.Cols(), "(col(Mat)) illegal column index"); return(TMSubVec(m.Rows(), m.Cols(), m.Ref() + i)); }