admin 发表于 2024-9-30 16:21:07

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

// 检查矩阵 info 的每行是否有且仅有两个元素的绝对值大于阈值
staticbool checkRows(const std::vector<std::vector<double>>& info, double threshold) {
       for (const auto& row : info) {
               int count = 0;
               for (double value : row) {
                       if (std::fabs(value) > threshold) {
                               ++count;
                       }
               }
               if (count != 2) {
                       return false; // 如果一行中不恰好有两个元素大于阈值,则返回 false
               }
       }
       return true; // 所有行都满足条件
}


// 检查矩阵 info 的每列是否有且仅有两个元素的绝对值大于阈值
static bool checkColumns(const std::vector<std::vector<double>>& info, double threshold) {
        size_t rows = info.size();
        if (rows == 0) return false; // 如果矩阵为空,直接返回 false
        size_t cols = info.size();

        for (size_t col = 0; col < cols; ++col) {
                int count = 0;
                for (size_t row = 0; row < rows; ++row) {
                        if (std::fabs(info) > threshold) {
                                ++count;
                        }
                }
                if (count != 2) {
                        return false; // 如果一列中不恰好有两个元素大于阈值,则返回 false
                }
        }
        return true; // 所有列都满足条件
}

admin 发表于 2024-9-30 16:26:46

// 辅助函数:找到向量中第二大的值和第三大的值
static std::pair<double, double> findSecondAndThirdLargest(const std::vector<double>& vec) {
        if (vec.size() < 3) {
                throw std::runtime_error("Vector must contain at least three elements.");
        }

        // 创建一个副本并排序
        std::vector<double> sortedVec = vec;
        std::sort(sortedVec.begin(), sortedVec.end(), std::greater<double>());

        // 去除重复元素
        auto last = std::unique(sortedVec.begin(), sortedVec.end());
        sortedVec.erase(last, sortedVec.end());

        // 确保至少有三个不同的元素
        if (sortedVec.size() < 3) {
                throw std::runtime_error("Vector must contain at least three unique elements.");
        }

        // 返回第二大的值和第三大的值
        return { sortedVec, sortedVec };
}

// 检查矩阵 info 的每行和每列是否满足条件
staticbool checkMatrix(const std::vector<std::vector<double>>& info, double n) {
        size_t rows = info.size();
        if (rows == 0) return false; // 如果矩阵为空,直接返回 false
        size_t cols = info.size();

        // 检查行
        for (const auto& row : info) {
                try {
                        auto = findSecondAndThirdLargest(row);
                        if (second <= n * third) {
                                return false; // 第二大的值不大于第三大的值n倍
                        }
                }
                catch (const std::exception& e) {
                        // 处理异常(如行中元素不足或不唯一)
                        return false;
                }
        }

        // 检查列
        for (size_t col = 0; col < cols; ++col) {
                std::vector<double> column;
                for (size_t row = 0; row < rows; ++row) {
                        column.push_back(info);
                }
                try {
                        auto = findSecondAndThirdLargest(column);
                        if (second <= n * third) {
                                return false; // 第二大的值不大于第三大的值n倍
                        }
                }
                catch (const std::exception& e) {
                        // 处理异常(如列中元素不足或不唯一)
                        return false;
                }
        }

        return true; // 所有行和列都满足条件
}
页: [1]
查看完整版本: ObjectARX检查矩阵 info 的每行是否有且仅有两个元素的绝对值大于阈值