/* Copyright (C) 2013 VATSIM Community / authors * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "blackmisc/mathmatrix3x3.h" #include "blackmisc/mathmatrix3x1.h" namespace BlackMisc { namespace Math { /* * Get element by column / row */ template double CMatrixBase::getElement(size_t row, size_t column) const { this->checkRange(row, column); return this->m_matrix(row, column); } /* * Set element by column / row */ template void CMatrixBase::setElement(size_t row, size_t column, double value) { this->checkRange(row, column); this->m_matrix(row, column) = value; } /* * Check range */ template void CMatrixBase::checkRange(size_t row, size_t column) const { bool valid = (row >= 0 && column >= 0 && row < Rows && column < Columns); Q_ASSERT_X(valid, "getElement()", "Row or column invalid"); if (!valid) throw std::range_error("Row or column invalid"); } /* * All values to random value */ template void CMatrixBase::setRandom() { for (int r = 0; r < Rows; r++) { for (int c = 0; c < Columns; c++) { this->m_matrix(r, c) = (qrand() % 101); // 0...100 } } } /* * All values zero? */ template bool CMatrixBase::isZero() const { for (int r = 0; r < Rows; r++) { for (int c = 0; c < Columns; c++) { if (this->m_matrix(r, c) != 0) return false; } } return true; } /* * All values equal? */ template bool CMatrixBase::allValuesEqual() const { double v = this->getElement(0, 0); for (int r = 0; r < Rows; r++) { for (int c = 0; c < Columns; c++) { if (this->m_matrix(r, c) != v) return false; } } return true; } /* * Round all values */ template void CMatrixBase::round() { for (int r = 0; r < Rows; r++) { for (int c = 0; c < Columns; c++) { this->m_matrix(r, c) = CMath::roundEpsilon(this->m_matrix(r, c), 1E-10); } } } /* * Convert to string */ template QString CMatrixBase::stringForConverter() const { QString s = "{"; for (int r = 0; r < Rows; r++) { s = s.append("{"); for (int c = 0; c < Columns; c++) { QString n = QString::number(this->m_matrix(r, c), 'f', 2); if (c > 0) s = s.append(","); s = s.append(n); } s = s.append("}"); } s = s.append("}"); return s; } // see here for the reason of thess forward instantiations // http://www.parashift.com/c++-faq/separate-template-class-defn-from-decl.html template class CMatrixBase; template class CMatrixBase; template class CMatrixBase; } // namespace } // namespace #include "mathmatrixbase.h"