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

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

我有一个 Matrix 市场 (.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();

希望对您有所帮助。

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

如果没有关于您的代码或目标的更多信息,很难准确地说出什么最有效。如果您是 using this format,,我会推荐类似的内容。

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

  1. 鉴于 Matrux 市场文件的 header 以 '%%' 开头,std::string::find() 可让您确定您阅读的行是否是 header。如果您关心这些,您可以转换为字符串流并解析字符串以获取有关文件的信息,例如 "matrix coordinate real general" 或其他信息。
  2. 每条评论都以“%”开头 - 如果您在字符串的开头发现这个字符,您可以忽略它并阅读下一个。
  3. 第一 non-comment 行是 3 个数字:行、列和条目。用字符串流解析这些;您将使用它们为您的数组分配内存。一旦你有了维度,This question 及其答案描述了一些动态分配你需要的 space 的好方法。
  4. 随后的每一行都描述了数组条目的坐标和值。您可以读取前两个数字并将它们用作二维数组的索引,然后使用第三个数字作为该点的条目。

Or, you could switch to C, which has a library dedicated to Matrix Market I/O.