如何在 C++ 中将矩阵市场文件转换为矩阵

How to convert matrix market file to matrix in c++

本文关键字:文件 转换 阵市 C++      更新时间:2023-10-16

我有一个矩阵市场(.mtx)文件。我想要从矩阵市场文件进行稀疏矩阵转换。任何人都可以建议一种在 c++ 中将矩阵市场格式转换为二维矩阵的方法吗?

我尝试了一种 matlab 方法在线将矩阵市场转换为稀疏矩阵。但是,我没有成功。 如果我在 c++ 中获得解决方案,那将有很大帮助。因为它有助于我的项目。

可能有几种方法可以读取 .mtx 数据。我刚刚解析了文件并用数据填充了矩阵。请在下面找到代码片段:

std::ifstream file("filaname.mtx");
int num_row, num_col, num_lines;
// Ignore comments headers
while (file.peek() == '%') file.ignore(2048, 'n');
// Read number of rows and columns
file >> num_row>> num_col >> num_lines;
// Create 2D array and fill with zeros
double* matrix;              
matrix = new double[num_row * num_col];      
std::fill(matrix, matrix + num_row *num_col, 0.);.
// fill the matrix with data
for (int l = 0; l < num_lines; l++)
{
double data;
int row, col;
file >> row >> col >> data;
matrix[(row -1) + (col -1) * num_row] = data;
}
file.close();

我希望它有所帮助。

如果没有关于您的代码或目标的更多信息,很难确切地说出什么效果最好。如果您使用的是这种格式,我会建议与此类似。

std::ifstream中打开文件,然后一次将一行行放入具有std::getline()std::string中进行处理。如果您知道该行具有所需的值,我还建议您将其转换为std::stringstream以便您可以使用>>运算符提取值。

  1. 假设 Matrux 市场文件的标题以"%%"开头,std::string::find()可以让您确定您读取的行是否是标题。您可以转换为字符串流并解析字符串以获取有关文件的信息,例如"矩阵坐标实则通用"或其他信息,如果您关心这些。
  2. 每个注释都以"%"开头 - 如果您在字符串的开头找到此字符,则可以忽略它并阅读下一个。
  3. 第一个非注释行是 3 个数字:行、列和条目。使用字符串流解析这些内容;您将使用它们为阵列分配内存。获得尺寸后,此问题及其答案描述了一些动态分配所需空间的好方法。
  4. 随后的每一行都描述数组条目的坐标和值。您可以读取前两个数字并将其用作 2D 数组的索引,然后使用第三个数字作为此时的条目。

或者,您可以切换到 C,它有一个专用于 Matrix Market I/O 的库。

美国国家标准与技术研究院提供了可以执行您正在寻找的文件操作的 C 代码。它还具有 C 语言中的读写操作示例。由于 C 代码与C++兼容,因此您可以在正在处理的项目中使用此代码。 https://math.nist.gov/MatrixMarket/mmio-c.html

fast_matrix_market库有一个加载器,可以完全满足你的需要:

std::ifstream file("filename.mtx");
std::vector<double> matrix;
int64_t nrows, ncols; // the file's dimensions saved here
fast_matrix_market::read_matrix_market_array(
file,
nrows, ncols,
matrix,
fast_matrix_market::row_major);

这将适用于稀疏和密集的MatrixMarket文件。