下面是一个使用C++读取包含行名和列名的物种矩阵并计算相对丰度的示例代码。该代码使用了OpenMP来实现并行计算,并输出带有行名和列名的矩阵表格。

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <omp.h>

using namespace std;

// 读取包含行名和列名的物种矩阵
vector<vector<double>> readMatrix(const string& filename) {
    ifstream file(filename);
    if (!file) {
        cerr << "Failed to open file: " << filename << endl;
        exit(1);
    }

    vector<vector<double>> matrix;

    // 读取列名
    string line;
    getline(file, line);
    stringstream colNames(line);
    string colName;
    while (colNames >> colName) {
        matrix.push_back(vector<double>());
    }

    // 读取行名和矩阵数据
    string rowName;
    double value;
    while (file >> rowName) {
        for (int i = 0; i < matrix.size(); i++) {
            file >> value;
            matrix[i].push_back(value);
        }
    }

    file.close();

    return matrix;
}

// 计算相对丰度
vector<vector<double>> calculateRelativeAbundance(const vector<vector<double>>& matrix) {
    vector<vector<double>> relAbundance(matrix.size(), vector<double>(matrix[0].size()));

    double rowSum;
    #pragma omp parallel for private(rowSum)
    for (int i = 0; i < matrix.size(); i++) {
        rowSum = 0.0;
        for (int j = 0; j < matrix[i].size(); j++) {
            rowSum += matrix[i][j];
        }

        for (int j = 0; j < matrix[i].size(); j++) {
            relAbundance[i][j] = matrix[i][j] / rowSum;
        }
    }

    return relAbundance;
}

// 输出带有行名和列名的矩阵表格
void printMatrix(const vector<vector<double>>& matrix, const vector<string>& rowNames, const vector<string>& colNames) {
    // 输出列名
    cout << "\t";
    for (const auto& name : colNames) {
        cout << name << "\t";
    }
    cout << endl;

    // 输出行名和矩阵数据
    for (int i = 0; i < matrix.size(); i++) {
        cout << rowNames[i] << "\t";
        for (int j = 0; j < matrix[i].size(); j++) {
            cout << matrix[i][j] << "\t";
        }
        cout << endl;
    }
}

int main() {
    // 读取物种矩阵
    vector<vector<double>> matrix = readMatrix("matrix.txt");

    // 读取行名和列名
    ifstream file("matrix.txt");
    string rowNamesLine;
    getline(file, rowNamesLine);
    stringstream rowNamesStream(rowNamesLine);
    string rowName;
    vector<string> rowNames;
    while (rowNamesStream >> rowName) {
        rowNames.push_back(rowName);
    }
    file.close();

    // 计算相对丰度
    vector<vector<double>> relAbundance = calculateRelativeAbundance(matrix);

    // 输出带有行名和列名的矩阵表格
    printMatrix(relAbundance, rowNames, rowNames);

    return 0;
}

请确保将包含行名和列名的物种矩阵保存为名为"matrix.txt"的文本文件,并放置在与源代码文件相同的目录中。每行的第一个元素应为行名,后续元素为该行对应的物种丰度。每个元素之间使用制表符分隔

用C++读取包含行名和列名的物种矩阵然后使用并行计算相对丰度最后输出带有行名和列名的的矩阵表格

原文地址: https://www.cveoy.top/t/topic/ihWC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录