从txt读取矩阵数据并定义稀疏矩阵
finish time:2025-05-12 12:10
Cpp读取矩阵数据
给定文件路径和分隔符,读取矩阵数据,返回二维vector.
#include<iostream>
#include<vector>
#include<string>
#include "matrix_reader.h"
int main() {
std::string file_name = "E:\\Cpp\\052201\\data.txt"; // 替换为你的文件路径
char delimiter = ',';
std::vector<std::vector<float>> matrix = readMatrixFromTxtFile(file_name, delimiter);
// 打印读取的数据
for (const auto& row : matrix) {
for (const auto& value : row) {
std::cout << value << " ";
}
std::cout << std::endl;
}
return 0;
}
//matrix_reader.cpp
#include "matrix_reader.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <stdexcept> // 用于处理异常
std::vector<std::vector<float>> readMatrixFromTxtFile(const std::string& filePath, char delimiter) {
std::vector<std::vector<float>> matrix;
std::ifstream file(filePath);
if (!file.is_open()) {
std::cerr << "无法打开文件:" << filePath << std::endl;
return matrix; // 返回空的二维vector
}
std::string line;
while (std::getline(file, line)) {
std::vector<float> row;
std::stringstream ss(line);
std::string cell;
while (std::getline(ss, cell, delimiter)) {
try {
// 将字符串转换为float
float value = std::stof(cell);
row.push_back(value);
}
catch (const std::invalid_argument& e) {
std::cerr << "无效的数值格式: " << cell << std::endl;
}
catch (const std::out_of_range& e) {
std::cerr << "数值超出范围: " << cell << std::endl;
}
}
matrix.push_back(row);
}
file.close();
return matrix;
}
//matrix_reader.h
#pragma once
// matrix_reader.h
#ifndef MATRIX_READER_H
#define MATRIX_READER_H
#include <vector>
#include <string>
// 声明函数
std::vector<std::vector<float>> readMatrixFromTxtFile(const std::string& filePath, char delimiter);
#endif // MATRIX_READER_H
matalb/python导出矩阵COO格式到txt文件
适用场景
需要将 MATLAB 矩阵导出到 C/C++/Python(NumPy) 等使用 0-based 索引的语言。适用于稀疏矩阵存储(如 CSR/CSC 转换前的 COO 格式)。
- matlab
数值仍以 %.15g 格式写入,保证精度。每行格式仍为 行,列,值,用逗号分隔。
function writeCOOToFile_ZeroIndexed(matrix, filename)
% writeCOOToFile_ZeroIndexed 将矩阵以COO格式(0-based索引)写入文本文件
% 输入参数:
% matrix: 二维矩阵
% filename: 要写入的文本文件名(包括路径)
% 输出:
% 无直接输出,但会生成包含COO格式数据的文本文件
%
% 示例:
% A = [1 0 3; 0 5 0; 7 0 9];
% writeCOOToFile_ZeroIndexed(A, 'matrix_coo.txt');
% 打开文件用于写入(如果已存在则覆盖)
fid = fopen(filename, 'w');
if fid == -1
error('无法打开文件 %s 进行写入', filename);
end
% 获取矩阵中非零元素的索引和值(MATLAB默认1-based)
[row, col, val] = find(matrix);
% 转换为0-based索引(适用于C/C++)
row = row(:) - 1;
col = col(:) - 1;
val = val(:);
% 将数据写入文件(格式:行,列,值)
for i = 1:length(val)
fprintf(fid, '%d,%d,%.15g\n', row(i), col(i), val(i));
end
% 关闭文件
fclose(fid);
disp(['COO格式数据(0-based索引)已成功写入 ' filename]);
end
- python version
每行格式:行,列,值(例如 0,0,1)。数值以默认浮点格式写入(若需更高精度,可用 f"{r},{c},{v:.15g}\n")
import numpy as np
def write_coo_to_file(matrix: np.ndarray, filename: str) -> None:
"""
将 2D NumPy 数组以 COO 格式(0-based 索引)写入文本文件
Args:
matrix (np.ndarray): 输入的 2D 数组
filename (str): 输出文件名(如 'matrix_coo.txt')
Returns:
None
Example:
>>> A = np.array([[1, 0, 3], [0, 5, 0], [7, 0, 9]])
>>> write_coo_to_file(A, 'matrix_coo.txt')
"""
if matrix.ndim != 2:
raise ValueError("输入必须是 2D 数组!")
# 获取非零元素的行、列索引和值
rows, cols = matrix.nonzero()
values = matrix[rows, cols]
# 转换为 0-based 索引(Python 默认是 0-based,但 nonzero() 返回的是 0-based,所以无需调整)
# 但如果 matrix 是从 MATLAB 或其他 1-based 系统导入的,可能需要 rows -= 1; cols -= 1
# 写入文件
with open(filename, 'w') as f:
for r, c, v in zip(rows, cols, values):
f.write(f"{r},{c},{v}\n")
print(f"COO 格式数据(0-based 索引)已写入 {filename}")