/* 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 < 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; } /* * Set cell index */ template void CMatrixBase::setCellIndex() { for (int r = 0; r < Rows; r++) { for (int c = 0; c < Columns; c++) { this->m_matrix(r, c) = r + 0.1 * c; } } } /* * To list */ template const QList CMatrixBase::toList() const { QList list; for (int r = 0; r < Rows; r++) { for (int c = 0; c < Columns; c++) { list.append(this->m_matrix(r, c)); } } return list; } /* * From list */ template void CMatrixBase::fromList(const QList &list) { Q_ASSERT_X(Rows * Columns == list.count(), "fromList()", "Mismatch of elements in list"); int ct = 0; for (int r = 0; r < Rows; r++) { for (int c = 0; c < Columns; c++) { this->m_matrix(r, c) = list.at(ct++); } } } /* * 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::convertToQString(bool /* i18n */) 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; } /* * Register metadata */ template void CMatrixBase::registerMetadata() { qRegisterMetaType(typeid(ImplMatrix).name()); qDBusRegisterMetaType(); } // 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