#pragma once #include "fesa/Core/Types.hpp" #include #include namespace fesa { class DenseMatrix { public: DenseMatrix() = default; DenseMatrix(LocalIndex rows, LocalIndex cols) : rows_(rows), cols_(cols), values_(static_cast(rows * cols), 0.0) {} LocalIndex rows() const { return rows_; } LocalIndex cols() const { return cols_; } Real& operator()(LocalIndex row, LocalIndex col) { return values_[static_cast(row * cols_ + col)]; } Real operator()(LocalIndex row, LocalIndex col) const { return values_[static_cast(row * cols_ + col)]; } void add(LocalIndex row, LocalIndex col, Real value) { (*this)(row, col) += value; } std::vector multiply(const std::vector& x) const { std::vector y(static_cast(rows_), 0.0); for (LocalIndex i = 0; i < rows_; ++i) { Real sum = 0.0; for (LocalIndex j = 0; j < cols_; ++j) { sum += (*this)(i, j) * x[static_cast(j)]; } y[static_cast(i)] = sum; } return y; } private: LocalIndex rows_ = 0; LocalIndex cols_ = 0; std::vector values_; }; } // namespace fesa