MatterElementAnalysis.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. //
  2. // Created by Austin on 2023/10/11.
  3. //
  4. #include "MatterElementAnalysis.h"
  5. MatterElementAnalysis::MatterElementAnalysis(const MEAMat &mat, const MEARangeMat &ranges)
  6. : mat_(mat), ranges_(ranges) {
  7. sample_num_ = mat_.count();
  8. if (sample_num_ == 0) {
  9. index_num_ = 0;
  10. } else {
  11. index_num_ = mat_.at(0).count();
  12. }
  13. for (int i = 0; i < sample_num_; ++i) {
  14. MEAMat cvtMat;
  15. for (int j = 0; j < index_num_; ++j) {
  16. cvtMat.append(QVector<double>(ranges_.count() - 1, 0.0));
  17. }
  18. range_cvt_.append(cvtMat);
  19. }
  20. for (int i = 0; i < sample_num_; ++i) {
  21. range_weights_.append(QVector<double>(ranges_.count() - 1, 0.0));
  22. }
  23. }
  24. void MatterElementAnalysis::evaluate() {
  25. //根据关联函数更新转换矩阵
  26. for (int s = 0; s < sample_num_; ++s) {
  27. for (int i = 0; i < index_num_; ++i) {
  28. double val = mat_.at(s).at(i);
  29. associatedValue(s, i, val);
  30. }
  31. }
  32. QVector<double> weights = {0.189, 0.203, 0.052, 0.162, 0.202, 0.151, 0.041};
  33. evaluationlevel(weights);
  34. }
  35. void MatterElementAnalysis::associatedValue(int sam, int index, double value) {
  36. auto pFunc = [](double v, double left, double right) {
  37. return std::abs(v - (left + right) / 2) - (right - left) / 2;
  38. };
  39. double r = 0;
  40. for (int i = 0; i < ranges_.count() - 1; ++i) //i是等级,index是指标
  41. {
  42. Q_ASSERT(ranges_.at(i).at(index).index == index);
  43. double minValue = ranges_.at(i).at(index).min_value;
  44. double maxValue = ranges_.at(i).at(index).max_value;
  45. double minend = ranges_.last().at(index).min_value;
  46. double maxend = ranges_.last().at(index).max_value;
  47. double r1 = pFunc(value, minValue, maxValue);
  48. double r2 = pFunc(value, minend, maxend);
  49. if (abs(r1 - r2) <= 0.00000001) {
  50. r = -r1 - 1;
  51. } else {
  52. r = r1 / (r2 - r1);
  53. }
  54. range_cvt_[sam][index][i] = r;
  55. //结果放在range_cvt_
  56. }
  57. }
  58. void MatterElementAnalysis::evaluationlevel(const QVector<double> &weights) { //输入计算出来的关联度,权值
  59. //计算一个样本权值之后的总关联度
  60. double r;
  61. for (int i = 0; i < sample_num_; ++i) //样本
  62. for (int j = 0; j < ranges_.count() - 1; ++j) { //等级
  63. r = 0;
  64. for (int k = 0; k < index_num_; ++k) { //指标
  65. r = r + range_cvt_[i][k][j] * weights[k];
  66. }
  67. range_weights_[i][j] = r;
  68. }
  69. }
  70. const MEAMat &MatterElementAnalysis::getRangeWeights() const {
  71. return range_weights_;
  72. }
  73. QVector<int> MatterElementAnalysis::getBestIndex() const {
  74. auto maxLoc = [](const QVector<double> &v) {
  75. int index = 0;
  76. double maxValue = v.at(0);
  77. for (int i = 1; i < v.count(); ++i) {
  78. if (v.at(i) > maxValue) {
  79. maxValue = v.at(i);
  80. index = i;
  81. }
  82. }
  83. return index;
  84. };
  85. QVector<int> result;
  86. for (const auto &s: range_weights_) {
  87. result << maxLoc(s) + 1;
  88. }
  89. return result;
  90. }