#include #include #include #include #include #include #include #include #include <omp.h>

// 定义一个结构体来存储每个物种的信息 struct Species { std::string name; std::vector abundance; };

// 从文件中读取物种矩阵 std::vector readSpeciesMatrix(const std::string& filename) { std::vector speciesMatrix; std::ifstream inputFile(filename); std::string line; bool isFirstLine = true;

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& data) { double shannonIndex = 0.0; double totalAbundance = std::accumulate(data.begin(), data.end(), 0.0);

for (double abundanceValue : data) {
    if (abundanceValue > 0) {
        double proportion = abundanceValue / totalAbundance;
        shannonIndex -= proportion * std::log2(proportion);
    }
}

return shannonIndex;

}

int main() { std::vector speciesMatrix = readSpeciesMatrix('cc.txt'); std::vector shannonIndices(speciesMatrix[0].abundance.size()); // 存储每列的Shannon指数

// 使用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;
C++ 代码:使用物种名称作为输出行名计算 Shannon 指数

原文地址: https://www.cveoy.top/t/topic/p2iQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录