#ifndef MATRIX_DYNAMIC_BASE_H #define MATRIX_DYNAMIC_BASE_H #include #include #include #include /** * @brief Matrix of variable size, needed for spectral graph layouting * @note Use MatrixBase whenever possible because it's more efficient (e.g. it doesn't use stl containers) */ template class MatrixDynamicBase { public: MatrixDynamicBase(); MatrixDynamicBase(const unsigned int numColumns, const unsigned int numRows); MatrixDynamicBase(const std::vector>& values); ~MatrixDynamicBase(); T getValue(const unsigned int columnIndex, const unsigned int rowIndex) const; void setValue(const unsigned int columnIndex, const unsigned int rowIndex, const T& value); unsigned int getColumnsCount() const; unsigned int getRowsCount() const; std::string toString() const; private: void initializeValues(const unsigned int numColumns, const unsigned int numRows); std::vector> m_values; }; template MatrixDynamicBase::MatrixDynamicBase() { } template MatrixDynamicBase::MatrixDynamicBase(const unsigned int numColumns, const unsigned int numRows) { initializeValues(numColumns, numRows); } template MatrixDynamicBase::MatrixDynamicBase(const std::vector>& values) : m_values(values) { } template MatrixDynamicBase::~MatrixDynamicBase() { } template T MatrixDynamicBase::getValue(const unsigned int columnIndex, const unsigned int rowIndex) const { return m_values[columnIndex][rowIndex]; } template void MatrixDynamicBase::setValue(const unsigned int columnIndex, const unsigned int rowIndex, const T& value) { m_values[columnIndex][rowIndex] = value; } template unsigned int MatrixDynamicBase::getColumnsCount() const { return m_values.size(); } template unsigned int MatrixDynamicBase::getRowsCount() const { if(m_values.size() > 0) { return m_values[0].size(); } return 0; } template std::string MatrixDynamicBase::toString() const { std::stringstream result; result << "\n"; unsigned int rowCount = getRowsCount(); unsigned int columnCount = getColumnsCount(); for(unsigned int j = 0; j < rowCount; j++) { for(unsigned int i = 0; i < columnCount; i++) { if(i > 0) { result << ", "; } result << m_values[i][j]; } result << "\n"; } return result.str(); } template void MatrixDynamicBase::initializeValues(const unsigned int numColumns, const unsigned int numRows) { for(unsigned int x = 0; x < numColumns; x++) { std::vector row; for(unsigned int y = 0; y < numRows; y++) { row.push_back(0); } m_values.push_back(row); } } template std::ostream& operator<<(std::ostream& ostream, const MatrixDynamicBase& matrix) { ostream << matrix.toString(); return ostream; } #endif // MATRIX_DYNAMIC_BASE_H