找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 23|回复: 1

ObjectARX检查矩阵 info 的每行是否有且仅有两个元素的绝对值大于阈值

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-9-30 16:21:07 | 显示全部楼层 |阅读模式
  1. // 检查矩阵 info 的每行是否有且仅有两个元素的绝对值大于阈值
  2. static  bool checkRows(const std::vector<std::vector<double>>& info, double threshold) {
  3.          for (const auto& row : info) {
  4.                  int count = 0;
  5.                  for (double value : row) {
  6.                          if (std::fabs(value) > threshold) {
  7.                                  ++count;
  8.                          }
  9.                  }
  10.                  if (count != 2) {
  11.                          return false; // 如果一行中不恰好有两个元素大于阈值,则返回 false
  12.                  }
  13.          }
  14.          return true; // 所有行都满足条件
  15. }
  16. // 检查矩阵 info 的每列是否有且仅有两个元素的绝对值大于阈值
  17. static bool checkColumns(const std::vector<std::vector<double>>& info, double threshold) {
  18.         size_t rows = info.size();
  19.         if (rows == 0) return false; // 如果矩阵为空,直接返回 false
  20.         size_t cols = info[0].size();
  21.         for (size_t col = 0; col < cols; ++col) {
  22.                 int count = 0;
  23.                 for (size_t row = 0; row < rows; ++row) {
  24.                         if (std::fabs(info[row][col]) > threshold) {
  25.                                 ++count;
  26.                         }
  27.                 }
  28.                 if (count != 2) {
  29.                         return false; // 如果一列中不恰好有两个元素大于阈值,则返回 false
  30.                 }
  31.         }
  32.         return true; // 所有列都满足条件
  33. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-9-30 16:26:46 | 显示全部楼层
  1. // 辅助函数:找到向量中第二大的值和第三大的值
  2. static std::pair<double, double> findSecondAndThirdLargest(const std::vector<double>& vec) {
  3.         if (vec.size() < 3) {
  4.                 throw std::runtime_error("Vector must contain at least three elements.");
  5.         }
  6.         // 创建一个副本并排序
  7.         std::vector<double> sortedVec = vec;
  8.         std::sort(sortedVec.begin(), sortedVec.end(), std::greater<double>());
  9.         // 去除重复元素
  10.         auto last = std::unique(sortedVec.begin(), sortedVec.end());
  11.         sortedVec.erase(last, sortedVec.end());
  12.         // 确保至少有三个不同的元素
  13.         if (sortedVec.size() < 3) {
  14.                 throw std::runtime_error("Vector must contain at least three unique elements.");
  15.         }
  16.         // 返回第二大的值和第三大的值
  17.         return { sortedVec[1], sortedVec[2] };
  18. }
  19. // 检查矩阵 info 的每行和每列是否满足条件
  20. static  bool checkMatrix(const std::vector<std::vector<double>>& info, double n) {
  21.         size_t rows = info.size();
  22.         if (rows == 0) return false; // 如果矩阵为空,直接返回 false
  23.         size_t cols = info[0].size();
  24.         // 检查行
  25.         for (const auto& row : info) {
  26.                 try {
  27.                         auto [second, third] = findSecondAndThirdLargest(row);
  28.                         if (second <= n * third) {
  29.                                 return false; // 第二大的值不大于第三大的值n倍
  30.                         }
  31.                 }
  32.                 catch (const std::exception& e) {
  33.                         // 处理异常(如行中元素不足或不唯一)
  34.                         return false;
  35.                 }
  36.         }
  37.         // 检查列
  38.         for (size_t col = 0; col < cols; ++col) {
  39.                 std::vector<double> column;
  40.                 for (size_t row = 0; row < rows; ++row) {
  41.                         column.push_back(info[row][col]);
  42.                 }
  43.                 try {
  44.                         auto [second, third] = findSecondAndThirdLargest(column);
  45.                         if (second <= n * third) {
  46.                                 return false; // 第二大的值不大于第三大的值n倍
  47.                         }
  48.                 }
  49.                 catch (const std::exception& e) {
  50.                         // 处理异常(如列中元素不足或不唯一)
  51.                         return false;
  52.                 }
  53.         }
  54.         return true; // 所有行和列都满足条件
  55. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-27 22:11 , Processed in 0.120273 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表