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

using namespace std;

// 数据结构,用于保存物种矩阵 struct SpeciesMatrix { vector<string> rowNames; vector<string> colNames; vector<vector<double>> data; };

// 读取物种矩阵文件 SpeciesMatrix readSpeciesMatrix(const string& filename) { SpeciesMatrix matrix; ifstream file(filename); string line;

// 读取行名
getline(file, line);
istringstream rowStream(line);
string rowName;
while (getline(rowStream, rowName, &#x27;	&#x27;)) {
    matrix.rowNames.push_back(rowName);
}

// 读取列名和数据
while (getline(file, line)) {
    istringstream lineStream(line);
    string colName;
    vector&#x3C;double&#x3E; rowData;
    getline(lineStream, colName, &#x27;	&#x27;);
    matrix.colNames.push_back(colName);

    double value;
    while (lineStream &#x3E;&#x3E; value) {
        rowData.push_back(value);
    }
    matrix.data.push_back(rowData);
}

return matrix;

}

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

#pragma omp parallel for
for (int i = 0; i &#x3C; matrix.data.size(); ++i) {
    double total = accumulate(matrix.data[i].begin(), matrix.data[i].end(), 0.0);

    for (int j = 0; j &#x3C; matrix.data[i].size(); ++j) {
        result[i][j] = matrix.data[i][j] / total;
    }
}

return result;

}

// 将矩阵表格输出到文件 void outputMatrixTable(const SpeciesMatrix& matrix, const vector<vector<double>>& result, const string& filename) { ofstream file(filename);

// 输出列名
file &#x3C;&#x3C; "Row/Col";
for (const auto& colName : matrix.colNames) {
    file &#x3C;&#x3C; &#x27;	&#x27; &#x3C;&#x3C; colName;
}
file &#x3C;&#x3C; endl;

// 输出行名和数据
for (int i = 0; i &#x3C; matrix.rowNames.size(); ++i) {
    file &#x3C;&#x3C; matrix.rowNames[i];

    for (int j = 0; j &#x3C; matrix.colNames.size(); ++j) {
        file &#x3C;&#x3C; &#x27;	&#x27; &#x3C;&#x3C; fixed &#x3C;&#x3C; setprecision(4) &#x3C;&#x3C; result[i][j];
    }

    file &#x3C;&#x3C; endl;
}

file.close();

}

int main() { string filename = "species_matrix.txt"; // 物种矩阵文件名 string outputFilename = "relative_abundance_matrix.txt"; // 输出文件名

// 读取物种矩阵
SpeciesMatrix matrix = readSpeciesMatrix(filename);

// 计算相对丰度
vector&#x3C;vector&#x3C;double&#x3E;&#x3E; result = calculateRelativeAbundance(matrix);

// 输出矩阵表格
outputMatrixTable(matrix, result, outputFilename);

return 0;
C++ 并行计算物种矩阵的相对丰度

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

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