11 #ifndef MCL_MATRIXOP_H
12 #define MCL_MATRIXOP_H
23 #include <Eigen/Dense>
29 std::vector<std::string>
Split(
const std::string&
string,
37 Matrix() noexcept : num_rows_(0), num_columns_(0) {}
52 Matrix(
const std::vector<std::vector<T> > vectors) noexcept {
53 num_rows_ = vectors.size();
55 num_columns_ = vectors[0].size();
56 for (
Int i=1; i<num_rows_; ++i) {
58 if ((
Int)vectors[i].size() != num_columns_) {
71 const T& element) noexcept {
73 "Out-of-bounds index in setting matrix element");
74 data_[index_row][index_column] = element;
80 ASSERT(index_column < num_columns_);
81 for (
Int i=0; i<num_rows_; ++i) {
87 void SetRow(
Int index_row, std::vector<T> row) noexcept {
89 ASSERT(index_row < num_rows_);
90 data_[index_row] = row;
95 ASSERT(index_row < num_rows_);
96 ASSERT(index_column < num_columns_);
97 return data_[index_row][index_column];
102 ASSERT(index_row < num_rows_);
103 return data_[index_row];
108 ASSERT(index_column < num_columns_);
109 std::vector<T> output(num_rows_);
110 for (
Int i=0; i<num_rows_; ++i) { output[i] = data_[i][index_column]; }
136 std::ofstream output_file;
137 output_file.open(file_name.c_str());
138 output_file<<std::fixed;
139 output_file<<std::setprecision((
int)precision);
140 for (
Int i=0; i<num_rows_; ++i) {
141 for (
Int j=0; j<num_columns_; ++j) {
142 output_file<<data_.at(i).at(j)<<
" ";
144 output_file<<std::endl;
150 std::vector<std::vector<T> >
data() noexcept {
return data_; }
158 std::ifstream in_file (file_name.c_str());
159 ASSERT(in_file.is_open());
162 Int number_of_rows = 0;
163 Int number_of_columns = 0;
164 while (std::getline(in_file, line)) {
165 std::vector<std::string> elements =
Split(line,
'\t');
166 if (number_of_columns == 0) { number_of_columns = (
Int) elements.size(); }
168 ASSERT(number_of_columns == (
Int)elements.size());
176 in_file.seekg(0,std::ios::beg);
180 Matrix<T> matrix(number_of_rows, number_of_columns);
181 for(
Int row=0; row<number_of_rows; ++row) {
182 std::getline(in_file, line);
183 std::vector<std::string> elements =
Split(line,
'\t');
184 for (
Int column=0; column<(
Int)elements.size(); ++column) {
197 Matrix<T> matrix(number_of_rows, number_of_columns);
198 for(
Int row=0; row<number_of_rows; ++row) {
199 for (
Int column=0; column<number_of_columns; ++column) {
215 std::vector<std::vector<T> > data_;
222 for (
Int i=0; i<matrix.num_rows(); ++i) {
223 for (
Int j=0; j<matrix.num_columns(); ++j) {
224 std::cout<<matrix.GetElement(i,j)<<
"\t";
226 std::cout<<std::endl;
233 Matrix<T> output(matrix.num_columns(), matrix.num_rows());
235 for (
Int i=0; i<output.num_rows(); ++i) {
236 for (
Int j=0; j<output.num_columns(); ++j) {
237 output.
SetElement(i, j, matrix.GetElement(j, i));
249 Matrix<T> output(matrix.num_rows(), matrix.num_columns());
250 for (
Int i=0; i<output.num_rows(); ++i) {
251 for (
Int j=0; j<output.num_columns(); ++j) {
252 output.
SetElement(i, j, matrix.GetElement(i, j)*value);
263 ASSERT(matrix_a.num_columns() == matrix_b.num_rows());
265 Matrix<T> output(matrix_a.num_rows(), matrix_b.num_columns());
266 for (
Int i=0; i<output.num_rows(); ++i) {
267 for (
Int j=0; j<output.num_columns(); ++j) {
268 T output_value = (T) 0.0;
269 for (
Int k=0; k<matrix_a.num_columns(); ++k) {
270 output_value += matrix_a.
GetElement(i, k) * matrix_b.GetElement(k, j);
272 output.SetElement(i, j, output_value);
280 const std::vector<T>& vector) noexcept {
281 ASSERT(matrix_a.num_columns() == (
Int)vector.size());
298 return Max<T>(matrix.Serial());
313 Eigen::MatrixXd ConvertToEigen(
const Matrix<Real>& input);
318 if (matrix_a.num_rows() != matrix_b.num_rows() |
319 matrix_a.num_columns() != matrix_b.num_columns()) {
return false; }
321 for (
Int i=0; i<matrix_a.num_rows(); ++i) {
322 for (
Int j=0; j<matrix_a.num_columns(); ++j) {
323 if (!
IsEqual(matrix_a.GetElement(i, j), matrix_b.GetElement(i, j))) {