C++ 代码:使用物种名称作为输出行名计算 Shannon 指数
#include
// 定义一个结构体来存储每个物种的信息
struct Species {
std::string name;
std::vector
// 从文件中读取物种矩阵
std::vector
while (std::getline(inputFile, line)) {
std::stringstream ss(line);
std::string cell;
Species species;
if (isFirstLine) {
// 跳过第一行,即列名
isFirstLine = false;
continue;
}
// 读取行名
std::getline(ss, species.name, '\t');
// 读取每个物种的丰度
while (std::getline(ss, cell, '\t')) {
species.abundance.push_back(std::stod(cell));
}
speciesMatrix.push_back(species);
}
inputFile.close();
return speciesMatrix;
}
// 计算Shannon指数
double calculateShannonIndex(const std::vector
for (double abundanceValue : data) {
if (abundanceValue > 0) {
double proportion = abundanceValue / totalAbundance;
shannonIndex -= proportion * std::log2(proportion);
}
}
return shannonIndex;
}
int main() {
std::vector
// 使用OpenMP并行计算每列的Shannon指数
#pragma omp parallel for
for (int i = 0; i < speciesMatrix[0].abundance.size(); i++) {
std::vector<double> data(speciesMatrix.size());
// 将每列的数据存储在一个vector中
for (int j = 0; j < speciesMatrix.size(); j++) {
data[j] = speciesMatrix[j].abundance[i];
}
double shannonIndex = calculateShannonIndex(data);
// 使用互斥锁保证并发的结果的正确性
#pragma omp critical
{
shannonIndices[i] = shannonIndex;
}
}
// 输出每列的Shannon指数
for (int i = 0; i < speciesMatrix.size(); i++) {
std::cout << speciesMatrix[i].name << '\t' << shannonIndices[i] << std::endl;
}
return 0;
原文地址: https://www.cveoy.top/t/topic/p2iQ 著作权归作者所有。请勿转载和采集!