如何在 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::string
和 std::getline()
中进行处理。如果您知道该行具有您想要的值,我还建议将其转换为 std::stringstream
,以便您可以使用 >>
运算符提取值。
- 鉴于 Matrux 市场文件的 header 以 '%%' 开头,
std::string::find()
可让您确定您阅读的行是否是 header。如果您关心这些,您可以转换为字符串流并解析字符串以获取有关文件的信息,例如 "matrix coordinate real general" 或其他信息。
- 每条评论都以“%”开头 - 如果您在字符串的开头发现这个字符,您可以忽略它并阅读下一个。
- 第一 non-comment 行是 3 个数字:行、列和条目。用字符串流解析这些;您将使用它们为您的数组分配内存。一旦你有了维度,This question 及其答案描述了一些动态分配你需要的 space 的好方法。
- 随后的每一行都描述了数组条目的坐标和值。您可以读取前两个数字并将它们用作二维数组的索引,然后使用第三个数字作为该点的条目。
Or, you could switch to C, which has a library dedicated to Matrix Market I/O.
我有一个 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::string
和 std::getline()
中进行处理。如果您知道该行具有您想要的值,我还建议将其转换为 std::stringstream
,以便您可以使用 >>
运算符提取值。
- 鉴于 Matrux 市场文件的 header 以 '%%' 开头,
std::string::find()
可让您确定您阅读的行是否是 header。如果您关心这些,您可以转换为字符串流并解析字符串以获取有关文件的信息,例如 "matrix coordinate real general" 或其他信息。 - 每条评论都以“%”开头 - 如果您在字符串的开头发现这个字符,您可以忽略它并阅读下一个。
- 第一 non-comment 行是 3 个数字:行、列和条目。用字符串流解析这些;您将使用它们为您的数组分配内存。一旦你有了维度,This question 及其答案描述了一些动态分配你需要的 space 的好方法。
- 随后的每一行都描述了数组条目的坐标和值。您可以读取前两个数字并将它们用作二维数组的索引,然后使用第三个数字作为该点的条目。
Or, you could switch to C, which has a library dedicated to Matrix Market I/O.