C++ 并行计算物种矩阵的相对丰度
#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, ' ')) {
matrix.rowNames.push_back(rowName);
}
// 读取列名和数据
while (getline(file, line)) {
istringstream lineStream(line);
string colName;
vector<double> rowData;
getline(lineStream, colName, ' ');
matrix.colNames.push_back(colName);
double value;
while (lineStream >> 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 < matrix.data.size(); ++i) {
double total = accumulate(matrix.data[i].begin(), matrix.data[i].end(), 0.0);
for (int j = 0; j < 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 << "Row/Col";
for (const auto& colName : matrix.colNames) {
file << ' ' << colName;
}
file << endl;
// 输出行名和数据
for (int i = 0; i < matrix.rowNames.size(); ++i) {
file << matrix.rowNames[i];
for (int j = 0; j < matrix.colNames.size(); ++j) {
file << ' ' << fixed << setprecision(4) << result[i][j];
}
file << endl;
}
file.close();
}
int main() { string filename = "species_matrix.txt"; // 物种矩阵文件名 string outputFilename = "relative_abundance_matrix.txt"; // 输出文件名
// 读取物种矩阵
SpeciesMatrix matrix = readSpeciesMatrix(filename);
// 计算相对丰度
vector<vector<double>> result = calculateRelativeAbundance(matrix);
// 输出矩阵表格
outputMatrixTable(matrix, result, outputFilename);
return 0;
原文地址: https://www.cveoy.top/t/topic/pZ8s 著作权归作者所有。请勿转载和采集!