MatterElementAnalysis.cpp 3.5 KB

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