天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 32|回复: 1

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

[复制链接]
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 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. }
    复制代码

     

     

     

     

    ObjectARX检查矩阵 info 的每行是否有且仅有两个元素的绝对值大于阈值
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
     楼主| 发表于 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. }
    复制代码

     

     

     

     

    ObjectARX检查矩阵 info 的每行是否有且仅有两个元素的绝对值大于阈值
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-1 10:20 , Processed in 0.157208 second(s), 24 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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