Skip to content

从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}")