用C++读取包含列名和行名的物种矩阵然后使用并行计算相对丰度最后输出带有行名和列名的的矩阵表格
以下是一个示例代码,用于读取包含列名和行名的物种矩阵,并使用并行计算相对丰度,最后输出带有行名和列名的矩阵表格。
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
#include <numeric>
#include <cmath>
#include <iomanip>
#include <omp.h>
// 定义物种矩阵类型
typedef std::vector<std::vector<double>> Matrix;
// 读取物种矩阵
Matrix readMatrix(const std::string& filename) {
std::ifstream file(filename);
Matrix matrix;
if (file.is_open()) {
std::string line, cell;
while (std::getline(file, line)) {
std::vector<double> row;
std::stringstream lineStream(line);
while (std::getline(lineStream, cell, '\t')) {
row.push_back(std::stod(cell));
}
matrix.push_back(row);
}
file.close();
}
return matrix;
}
// 计算每行的和
std::vector<double> calculateRowSums(const Matrix& matrix) {
std::vector<double> rowSums(matrix.size());
#pragma omp parallel for
for (size_t i = 0; i < matrix.size(); ++i) {
rowSums[i] = std::accumulate(matrix[i].begin(), matrix[i].end(), 0.0);
}
return rowSums;
}
// 计算相对丰度
Matrix calculateRelativeAbundance(const Matrix& matrix) {
Matrix relativeAbundance(matrix.size(), std::vector<double>(matrix[0].size()));
std::vector<double> rowSums = calculateRowSums(matrix);
#pragma omp parallel for collapse(2)
for (size_t i = 0; i < matrix.size(); ++i) {
for (size_t j = 0; j < matrix[i].size(); ++j) {
relativeAbundance[i][j] = matrix[i][j] / rowSums[i];
}
}
return relativeAbundance;
}
// 输出带有行名和列名的矩阵表格
void printMatrix(const Matrix& matrix, const std::vector<std::string>& rowNames, const std::vector<std::string>& colNames) {
std::cout << std::setw(10) << " ";
for (const auto& colName : colNames) {
std::cout << std::setw(10) << colName;
}
std::cout << std::endl;
for (size_t i = 0; i < matrix.size(); ++i) {
std::cout << std::setw(10) << rowNames[i];
for (size_t j = 0; j < matrix[i].size(); ++j) {
std::cout << std::setw(10) << matrix[i][j];
}
std::cout << std::endl;
}
}
int main() {
std::string filename = "species_matrix.txt";
// 读取物种矩阵
Matrix matrix = readMatrix(filename);
// 物种矩阵的行名和列名
std::vector<std::string> rowNames = {"Species1", "Species2", "Species3"};
std::vector<std::string> colNames = {"Sample1", "Sample2", "Sample3", "Sample4"};
// 计算相对丰度
Matrix relativeAbundance = calculateRelativeAbundance(matrix);
// 输出带有行名和列名的矩阵表格
printMatrix(relativeAbundance, rowNames, colNames);
return 0;
}
请注意,上述代码使用了OpenMP进行并行计算。确保你的编译器支持OpenMP,并使用适当的编译选项启用OpenMP支持
原文地址: https://www.cveoy.top/t/topic/ihWP 著作权归作者所有。请勿转载和采集!