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; // 所有列都满足条件
} // 辅助函数:找到向量中第二大的值和第三大的值
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]