54 lines
1.2 KiB
C++
54 lines
1.2 KiB
C++
#pragma once
|
|
|
|
#include "fesa/Core/Types.hpp"
|
|
|
|
#include <cstddef>
|
|
#include <vector>
|
|
|
|
namespace fesa {
|
|
|
|
class DenseMatrix {
|
|
public:
|
|
DenseMatrix() = default;
|
|
DenseMatrix(LocalIndex rows, LocalIndex cols) : rows_(rows), cols_(cols), values_(static_cast<std::size_t>(rows * cols), 0.0) {}
|
|
|
|
LocalIndex rows() const {
|
|
return rows_;
|
|
}
|
|
|
|
LocalIndex cols() const {
|
|
return cols_;
|
|
}
|
|
|
|
Real& operator()(LocalIndex row, LocalIndex col) {
|
|
return values_[static_cast<std::size_t>(row * cols_ + col)];
|
|
}
|
|
|
|
Real operator()(LocalIndex row, LocalIndex col) const {
|
|
return values_[static_cast<std::size_t>(row * cols_ + col)];
|
|
}
|
|
|
|
void add(LocalIndex row, LocalIndex col, Real value) {
|
|
(*this)(row, col) += value;
|
|
}
|
|
|
|
std::vector<Real> multiply(const std::vector<Real>& x) const {
|
|
std::vector<Real> y(static_cast<std::size_t>(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<std::size_t>(j)];
|
|
}
|
|
y[static_cast<std::size_t>(i)] = sum;
|
|
}
|
|
return y;
|
|
}
|
|
|
|
private:
|
|
LocalIndex rows_ = 0;
|
|
LocalIndex cols_ = 0;
|
|
std::vector<Real> values_;
|
|
};
|
|
|
|
} // namespace fesa
|