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

时间:2019-07-17 12:26:39

标签: c++ matrix sparse-matrix

我有一个Matrix market(.mtx)文件。我想要从矩阵市场文件进行稀疏矩阵转换。谁能建议一种将矩阵市场格式转换为c ++的二维矩阵的方法?

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

3 个答案:

答案 0 :(得分:1)

可能有几种读取.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();

希望对您有帮助。

答案 1 :(得分:1)

在没有有关代码或目标的更多信息的情况下,很难确切地说出最有效的方法。如果您using this format,,我会建议类似的内容。

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

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

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

答案 2 :(得分:0)

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