diff --git a/CMakeLists.txt b/CMakeLists.txt index b8cff99f..ad0da40c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,8 +2,8 @@ cmake_minimum_required(VERSION 3.0) cmake_policy(SET CMP0017 NEW) # need include() with .cmake project(PIP) set(PIP_MAJOR 3) -set(PIP_MINOR 17) -set(PIP_REVISION 1) +set(PIP_MINOR 18) +set(PIP_REVISION 0) set(PIP_SUFFIX ) set(PIP_COMPANY SHS) set(PIP_DOMAIN org.SHS) diff --git a/libs/main/math/pimathmatrix.h b/libs/main/math/pimathmatrix.h index 229611cd..242c9c4f 100644 --- a/libs/main/math/pimathmatrix.h +++ b/libs/main/math/pimathmatrix.h @@ -679,6 +679,61 @@ public: return outm; } + //! \~english + //! \brief Returns this matrix with another element type. + //! \~russian + //! \brief Возвращает эту матрицу с другим типом элементов. + template + PIMathMatrixT toType() const { + PIMathMatrixT ret; + PIMM_FOR ret[r][c] = element(r, c); + return ret; + } + + //! \~english + //! \brief Returns the submatrix with size SubRows x SubCols. Elements takes from coordinates "row_offset" and "col_offset". + //! \details + //! \~russian + //! \brief Возвращает подматрицу с размерами SubRows x SubCols. Элементы берутся с координат "row_offset" и "col_offset". + //! \details Координаты могут быть отрицательными. Возвращаемая матрица может быть любого размера. Если исходные элементы выходят + //! за границы исходной матрицы, то в подматрице будут нули. + template + PIMathMatrixT submatrix(int row_offset = 0, int col_offset = 0) const { + PIMathMatrixT ret; + for (int r = 0; r < (int)SubRows; ++r) { + int sr = r + row_offset; + if (sr < 0 || sr >= (int)Rows) continue; + for (int c = 0; c < (int)SubCols; ++c) { + int sc = c + col_offset; + if (sc < 0 || sc >= (int)Cols) continue; + ret.element(r, c) = element(sr, sc); + } + } + return ret; + } + + //! \~english + //! \brief Set the submatrix "m" in coordinates "row_index" and "col_index". + //! \details + //! \~russian + //! \brief Устанавливает подматрицу "m" в координаты "row_index" и "col_index". + //! \details Присваивает значения из матрицы "m" в прямоугольную область текущией матрицы, ограниченную + //! размерами "m", самой матрицы и границами, исходя из координат установки. Координаты могут быть отрицательными. + //! Матрица "m" может быть любого размера. Возвращает ссылку на эту матрицу. + template + PIMathMatrixT & setSubmatrix(int row_index, int col_index, const PIMathMatrixT & m) { + for (int r = 0; r < (int)SubRows; ++r) { + int sr = r + row_index; + if (sr < 0 || sr >= (int)Rows) continue; + for (int c = 0; c < (int)SubCols; ++c) { + int sc = c + col_index; + if (sc < 0 || sc >= (int)Cols) continue; + element(sr, sc) = m.element(r, c); + } + } + return *this; + } + private: Type m[Rows][Cols]; };