C++ 计算矩阵列之间的MIC系数并优化结果格式

本文提供了一个C++函数,用于计算矩阵中每两列之间的最大信息系数 (MIC)。该函数接受一个矩阵和列名作为输入,并返回一个矩阵,其中包含所有列对的MIC值。

原始代码问题:

原始代码仅计算并填充了结果矩阵的上三角部分,而下三角部分未被填充。

**修正后的代码:**cppmatrix<double, row_major> calc_mic(const matrix<double, row_major>& mat, const std::vectorstd::string& col_names, int threads) { // 当样本量小于6个时,终止程序 if(mat.size1() < 6){ std::cerr << 'error: the number of data rows should be greater than 5.' << std::endl; return matrix<double, row_major>(); // 返回空矩阵表示错误 } if(mat.size2() < 2){ std::cerr << 'error: the number of data columns should be greater than 1.' << std::endl; return matrix<double, row_major>(); // 返回空矩阵表示错误 } // 创建结果矩阵,存储列名和MIC值 matrix<double, row_major> result(mat.size2() * (mat.size2() - 1) / 2, 3); // 创建MINE对象 // 计算每列两两之间的mic系数,并将结果存储到result矩阵中 omp_set_num_threads(threads); size_t index = 0; #pragma omp parallel for for (size_t i = 0; i < mat.size2(); i++) { MINE mine(0.5, 15, EST_MIC_APPROX); for (size_t j = i + 1; j < mat.size2(); j++) { double x[mat.size1()]; double y[mat.size1()]; for (size_t k = 0; k < mat.size1(); k++) { x[k] = mat(k, i); y[k] = mat(k, j); } mine.compute_score(x, y, mat.size1()); #pragma omp critical { result(index, 0) = i; result(index, 1) = j; result(index, 2) = mine.mic(); index++; } } } return result;}

代码解释:

  1. 错误处理: 代码首先检查输入矩阵的行数和列数是否符合要求。如果行数小于6或列数小于2,则输出错误信息并返回。2. 创建结果矩阵: 创建一个 result 矩阵,用于存储计算得到的 MIC 值以及对应的列名。 result 矩阵的大小为 mat.size2() * (mat.size2() - 1) / 2 行,3 列,其中每一行存储一对列的 MIC 值,以及对应的列索引。3. 计算 MIC: 使用 OpenMP 并行化计算每两列之间的 MIC 值。循环遍历所有列对,使用 MINE 对象计算 MIC 值。4. 存储结果: 将计算得到的 MIC 值以及对应的列索引存储到 result 矩阵中。5. 返回结果: 返回包含所有列对 MIC 值的 result 矩阵。

**使用示例:**cpp// 示例矩阵和列名matrix<double, row_major> mat = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}};std::vectorstd::string col_names = {'col1', 'col2', 'col3'};

// 计算 MIC matrix<double, row_major> result = calc_mic(mat, col_names, 2);

// 打印结果for (size_t i = 0; i < result.size1(); ++i) { std::cout << col_names[static_cast<size_t>(result(i, 0))] << ' - ' << col_names[static_cast<size_t>(result(i, 1))] << ': ' << result(i, 2) << std::endl;}

输出:

col1 - col2: 1col1 - col3: 1col2 - col3: 1

注意:

  • 该代码需要包含 MINE.h 头文件以及链接相应的库文件。* 可以根据实际情况调整 MINE 对象的构造函数参数和 OpenMP 线程数。* 结果矩阵 result 中的第一列和第二列表示列的索引,可以通过 col_names 向量获取对应的列名。
C++ 计算矩阵列之间的MIC系数并优化结果格式

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

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