用C++读取包含行名和列名的物种矩阵并使用并行计算的相对丰度然后输出为矩阵表格
下面是一个示例代码,使用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, '\t')) {
matrix.rowNames.push_back(rowName);
}
// 读取列名和数据
while (getline(file, line)) {
istringstream lineStream(line);
string colName;
vector<double> rowData;
getline(lineStream, colName, '\t');
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 << '\t' << 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 << '\t' << 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;
}
请确保将物种矩阵文件命名为species_matrix.txt,并将其与代码文件放在同一目录下。运行代码后,将生成一个名为relative_abundance_matrix.txt的输出文件,其中包含相对丰度的矩阵表格
原文地址: https://www.cveoy.top/t/topic/ihVv 著作权归作者所有。请勿转载和采集!