5#include <igl/list_to_matrix.h>
18 bool read_matrix(
const std::string &path, Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &mat)
20 std::string extension = std::filesystem::path(path).extension().string();
21 std::transform(extension.begin(), extension.end(), extension.begin(),
22 [](
unsigned char c) { return std::tolower(c); });
24 if (extension ==
".txt")
28 else if (extension ==
".bin")
41 template <
typename Mat>
44 std::string extension = std::filesystem::path(path).extension().string();
45 std::transform(extension.begin(), extension.end(), extension.begin(),
46 [](
unsigned char c) { return std::tolower(c); });
48 if (extension ==
".txt")
52 else if (extension ==
".bin")
58 logger().warn(
"Uknown output matrix format (\"{}\"). Using ASCII format.");
63 template <
typename Mat>
64 bool write_matrix(
const std::string &path,
const std::string &key,
const Mat &mat,
const bool replace)
66 h5pp::File hdf5_file(path, replace ? h5pp::FileAccess::REPLACE : h5pp::FileAccess::READWRITE);
67 hdf5_file.writeDataset(mat, key);
72 template <
typename Mat>
73 bool read_matrix(
const std::string &path,
const std::string &key, Mat &mat)
75 h5pp::File hdf5_file(path, h5pp::FileAccess::READONLY);
76 if (!hdf5_file.linkExists(key))
78 mat = hdf5_file.readDataset<Mat>(key);
83 bool read_matrix_ascii(
const std::string &path, Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &mat)
86 file.open(path.c_str());
90 logger().error(
"Failed to open file: {}", path);
97 std::vector<std::vector<T>> matrix;
99 while (getline(file, s))
103 std::stringstream input(s);
105 matrix.emplace_back();
107 std::vector<T> ¤tLine = matrix.back();
109 while (input >> temp)
110 currentLine.push_back(temp);
113 if (!igl::list_to_matrix(matrix, mat))
115 logger().error(
"list to matrix error");
124 template <
typename Mat>
127 std::ofstream out(path);
130 logger().error(
"Failed to write to file: {}", path);
143 template <
typename T>
144 bool read_matrix_binary(
const std::string &path, Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &mat)
146 typedef typename Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>::Index Index;
148 std::ifstream in(path, std::ios::in | std::ios::binary);
151 logger().error(
"Failed to open file: {}", path);
157 Index rows = 0, cols = 0;
158 in.read((
char *)(&rows),
sizeof(Index));
159 in.read((
char *)(&cols),
sizeof(Index));
161 mat.resize(rows, cols);
162 in.read((
char *)mat.data(), rows * cols *
sizeof(T));
168 template <
typename Mat>
171 typedef typename Mat::Index Index;
172 typedef typename Mat::Scalar Scalar;
173 std::ofstream out(path, std::ios::out | std::ios::binary);
177 logger().error(
"Failed to write to file: {}", path);
183 const Index rows = mat.rows(), cols = mat.cols();
184 out.write((
const char *)(&rows),
sizeof(Index));
185 out.write((
const char *)(&cols),
sizeof(Index));
186 out.write((
const char *)mat.data(), rows * cols *
sizeof(Scalar));
194 std::ofstream csv(path, std::ios::out);
198 logger().error(
"Failed to write to file: {}", path);
204 csv << std::setprecision(std::numeric_limits<long double>::digits10 + 2);
206 csv << fmt::format(
"shape,{},{}\n", mat.rows(), mat.cols());
207 csv <<
"Row,Col,Val\n";
208 for (
int k = 0; k < mat.outerSize(); ++k)
210 for (Eigen::SparseMatrix<double>::InnerIterator it(mat, k); it; ++it)
212 csv << it.row() <<
","
214 << it.value() <<
"\n";
222 template <
typename T>
224 const std::string &path,
const json &
import, Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &mat)
227 if (
import.contains(
"offset"))
229 const int offset =
import[
"offset"];
231 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> tmp;
235 assert(mat.rows() >= offset && mat.cols() >= 1);
236 mat.block(0, 0, offset, 1) = tmp.block(0, 0, offset, 1);
247 template bool read_matrix<int>(
const std::string &, Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic> &);
248 template bool read_matrix<double>(
const std::string &, Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> &);
template bool import_matrix< double >(const std::string &path, const json &import, Eigen::MatrixXd &mat)
template bool write_matrix< Eigen::VectorXd >(const std::string &, const Eigen::VectorXd &)
template bool read_matrix_binary< int >(const std::string &, Eigen::Matrix< int, Eigen::Dynamic, Eigen::Dynamic > &)
template bool write_matrix< Eigen::VectorXf >(const std::string &, const Eigen::VectorXf &)
bool read_matrix(const std::string &path, Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &mat)
Reads a matrix from a file. Determines the file format based on the path's extension.
template bool write_matrix_ascii< Eigen::VectorXd >(const std::string &, const Eigen::VectorXd &)
bool read_matrix_binary(const std::string &path, Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &mat)
template bool import_matrix< int >(const std::string &path, const json &import, Eigen::MatrixXi &mat)
template bool write_matrix_binary< Eigen::MatrixXd >(const std::string &, const Eigen::MatrixXd &)
template bool write_matrix_binary< Eigen::MatrixXf >(const std::string &, const Eigen::MatrixXf &)
bool import_matrix(const std::string &path, const json &import, Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &mat)
template bool write_matrix_ascii< Eigen::MatrixXf >(const std::string &, const Eigen::MatrixXf &)
template bool write_matrix_binary< Eigen::VectorXd >(const std::string &, const Eigen::VectorXd &)
template bool write_matrix< Eigen::MatrixXf >(const std::string &, const Eigen::MatrixXf &)
bool write_matrix_binary(const std::string &path, const Mat &mat)
bool read_matrix_ascii(const std::string &path, Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &mat)
template bool write_matrix< Eigen::MatrixXd >(const std::string &, const Eigen::MatrixXd &)
bool write_matrix_ascii(const std::string &path, const Mat &mat)
template bool read_matrix_binary< double >(const std::string &, Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > &)
template bool read_matrix< Eigen::MatrixXd >(const std::string &, const std::string &, Eigen::MatrixXd &)
bool write_sparse_matrix_csv(const std::string &path, const Eigen::SparseMatrix< double > &mat)
template bool read_matrix< int >(const std::string &, Eigen::Matrix< int, Eigen::Dynamic, Eigen::Dynamic > &)
template bool read_matrix< Eigen::MatrixXi >(const std::string &, const std::string &, Eigen::MatrixXi &)
template bool write_matrix_binary< Eigen::VectorXf >(const std::string &, const Eigen::VectorXf &)
template bool read_matrix< double >(const std::string &, Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > &)
template bool write_matrix_ascii< Eigen::VectorXf >(const std::string &, const Eigen::VectorXf &)
template bool read_matrix_ascii< double >(const std::string &, Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > &)
template bool read_matrix_ascii< int >(const std::string &, Eigen::Matrix< int, Eigen::Dynamic, Eigen::Dynamic > &)
template bool write_matrix_ascii< Eigen::MatrixXd >(const std::string &, const Eigen::MatrixXd &)
bool write_matrix(const std::string &path, const Mat &mat)
Writes a matrix to a file. Determines the file format based on the path's extension.
spdlog::logger & logger()
Retrieves the current logger.