如何在c++中将矩阵行情文件转换为矩阵

yws3nbqq  于 2023-01-15  发布在  其他
关注(0)|答案(4)|浏览(144)

我有一个矩阵市场(.mtx)文件。我想从矩阵市场文件稀疏矩阵转换。谁能建议一种方法来转换矩阵市场格式为二维矩阵在c++?
我曾经尝试过用matlab的方法把矩阵市场转换成稀疏矩阵,但是,我没有成功。如果我能用c++来解决这个问题,那将是一个很大的帮助。因为这对我的项目很有帮助。

4nkexdtk

4nkexdtk1#

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

希望能有所帮助。

pobjuy32

pobjuy322#

如果没有更多关于代码或目标的信息,很难说什么是最好的,如果你是using this format,,我会建议类似的东西。
std::ifstream中打开该文件,然后使用std::getline()一次获取一行到std::string中进行处理。如果您知道该行具有所需的值,我还建议将其转换为std::stringstream,以便您可以使用>>操作符提取值。
1.假设Matrux market文件的头以'%%'开头,std::string::find()可以让你判断你读到的行是否是头。你可以转换成stringstream并解析字符串来获取文件的信息,如“matrix coordinate真实的general”或其他信息。
1.每个注解都以“%”开头--如果您在字符串的开头找到这个字符,您可以忽略它并阅读下一个注解。
1.第一个非注解行是3个数字:行、列和条目。用字符串流解析它们;你将使用它们来为你的数组分配内存,一旦你有了维度,This question和它的答案描述了一些动态分配你需要的空间的好方法。
1.后面的每一行都描述了数组项的坐标和值。您可以读取前两个数字并将其用作二维数组的索引,然后使用第三个数字作为该点的项。
Or, you could switch to C, which has a library dedicated to Matrix Market I/O.

zrfyljdw

zrfyljdw3#

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

dgenwo3n

dgenwo3n4#

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文件。

相关问题