用C++读取包含行名和列名的物种矩阵并按列使用并行计算的相对丰度然后输出为矩阵表格
下面是一个示例代码,用于读取包含行名和列名的物种矩阵,并使用并行计算计算相对丰度,并将结果输出为矩阵表格。
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <algorithm>
#include <numeric>
#include <omp.h>
// 定义物种矩阵类型
typedef std::vector<std::vector<double>> SpeciesMatrix;
// 读取物种矩阵文件
SpeciesMatrix readSpeciesMatrix(const std::string& filename) {
std::ifstream file(filename);
SpeciesMatrix matrix;
std::string line;
while (std::getline(file, line)) {
std::vector<double> row;
std::stringstream ss(line);
double value;
while (ss >> value) {
row.push_back(value);
}
matrix.push_back(row);
}
return matrix;
}
// 计算每列的相对丰度
std::vector<double> calculateRelativeAbundance(const SpeciesMatrix& matrix) {
std::vector<double> relativeAbundance(matrix[0].size(), 0.0);
#pragma omp parallel for
for (int col = 0; col < matrix[0].size(); col++) {
double columnTotal = std::accumulate(matrix.begin(), matrix.end(), 0.0,
[col](double sum, const std::vector<double>& row) { return sum + row[col]; });
#pragma omp critical
{
relativeAbundance[col] = columnTotal / matrix.size();
}
}
return relativeAbundance;
}
// 输出矩阵表格
void printMatrix(const SpeciesMatrix& matrix) {
for (const auto& row : matrix) {
for (const auto& value : row) {
std::cout << value << "\t";
}
std::cout << std::endl;
}
}
int main() {
std::string filename = "species_matrix.txt";
SpeciesMatrix matrix = readSpeciesMatrix(filename);
std::vector<double> relativeAbundance = calculateRelativeAbundance(matrix);
printMatrix(matrix);
std::cout << "Relative Abundance:" << std::endl;
for (const auto& value : relativeAbundance) {
std::cout << value << "\t";
}
std::cout << std::endl;
return 0;
}
在上面的代码中,readSpeciesMatrix函数用于从文件中读取物种矩阵,每一行代表一个物种,每一列代表一个样本。calculateRelativeAbundance函数使用并行计算来计算每列的相对丰度。printMatrix函数用于将矩阵表格输出到控制台。
你需要将物种矩阵保存为一个文本文件,每一行代表一个物种,每一列之间使用空格或制表符分隔。在示例代码中,文件名为species_matrix.txt,你可以根据实际情况进行修改。
运行示例代码后,将会输出原始物种矩阵和每列的相对丰度矩阵。你可以根据需要将结果保存到文件中,或进行其他进一步的处理
原文地址: https://www.cveoy.top/t/topic/ihVo 著作权归作者所有。请勿转载和采集!