/*========================================================================= * * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *=========================================================================*/ #ifndef itkMatrix_hxx #define itkMatrix_hxx #include "itkNumericTraits.h" namespace itk { /** * Product by a Vector */ template Vector Matrix::operator*(const Vector & vect) const { Vector result; for (unsigned int r = 0; r < VRows; ++r) { T sum{}; for (unsigned int c = 0; c < VColumns; ++c) { sum += m_Matrix(r, c) * vect[c]; } result[r] = sum; } return result; } /** * Product by a Point */ template Point Matrix::operator*(const Point & pnt) const { Point result; for (unsigned int r = 0; r < VRows; ++r) { T sum{}; for (unsigned int c = 0; c < VColumns; ++c) { sum += m_Matrix(r, c) * pnt[c]; } result[r] = sum; } return result; } /** * Product by a vnl_vector_fixed */ template vnl_vector_fixed Matrix::operator*(const vnl_vector_fixed & inVNLvect) const { vnl_vector_fixed result; for (unsigned int r = 0; r < VRows; ++r) { T sum{}; for (unsigned int c = 0; c < VColumns; ++c) { sum += m_Matrix(r, c) * inVNLvect[c]; } result[r] = sum; } return result; } /** * Product by a CovariantVector */ template CovariantVector Matrix::operator*(const CovariantVector & covect) const { CovariantVector result; for (unsigned int r = 0; r < VRows; ++r) { T sum{}; for (unsigned int c = 0; c < VColumns; ++c) { sum += m_Matrix(r, c) * covect[c]; } result[r] = sum; } return result; } /** * Product by a matrix */ template Matrix Matrix::operator*(const CompatibleSquareMatrixType & matrix) const { const Self result(m_Matrix * matrix.GetVnlMatrix()); return result; } /** * Matrix Addition */ template Matrix Matrix::operator+(const Self & matrix) const { Self result; for (unsigned int r = 0; r < VRows; ++r) { for (unsigned int c = 0; c < VColumns; ++c) { result.m_Matrix(r, c) = m_Matrix(r, c) + matrix.m_Matrix(r, c); } } return result; } /** * Matrix Addition in-place */ template const Matrix & Matrix::operator+=(const Self & matrix) { for (unsigned int r = 0; r < VRows; ++r) { for (unsigned int c = 0; c < VColumns; ++c) { m_Matrix(r, c) += matrix.m_Matrix(r, c); } } return *this; } /** * Matrix Subtraction */ template Matrix Matrix::operator-(const Self & matrix) const { Self result; for (unsigned int r = 0; r < VRows; ++r) { for (unsigned int c = 0; c < VColumns; ++c) { result.m_Matrix(r, c) = m_Matrix(r, c) - matrix.m_Matrix(r, c); } } return result; } /** * Matrix subtraction in-place */ template const Matrix & Matrix::operator-=(const Self & matrix) { for (unsigned int r = 0; r < VRows; ++r) { for (unsigned int c = 0; c < VColumns; ++c) { m_Matrix(r, c) -= matrix.m_Matrix(r, c); } } return *this; } /** * Product by a vnl_matrix */ template vnl_matrix Matrix::operator*(const vnl_matrix & matrix) const { return m_Matrix * matrix; } /** * Product by a matrix */ template void Matrix::operator*=(const CompatibleSquareMatrixType & matrix) { m_Matrix *= matrix.GetVnlMatrix(); } /** * Product by a vnl_matrix */ template void Matrix::operator*=(const vnl_matrix & matrix) { m_Matrix *= matrix; } /** * Product by a vnl_vector */ template vnl_vector Matrix::operator*(const vnl_vector & vc) const { return m_Matrix * vc; } } // end namespace itk #endif