编写生成所有组合的函数:将变长向量组转换为组合矩阵
解决vector<vector>生成全组合(笛卡尔积)的问题
你的代码问题在于:只单独遍历每个维度的元素,且固定其他维度的首个元素,这样只能生成单维度变化的组合,无法覆盖不同维度元素交叉组合的情况,所以会漏掉如20+3、30+3这类组合。要实现需求,本质是要计算多个向量的笛卡尔积——即从每个子向量中选取一个元素,生成所有可能的组合。
方法一:递归实现
递归思路是逐步构建组合:从第一个子向量开始,将当前已生成的所有组合与下一个子向量的每个元素拼接,直到处理完所有子向量。
#include <vector> using namespace std; void generateCartesian(const vector<vector<double>>& input, int index, vector<double>& current, vector<vector<double>>& result) { if (index == input.size()) { result.push_back(current); return; } for (double num : input[index]) { current.push_back(num); generateCartesian(input, index + 1, current, result); current.pop_back(); // 回溯 } } vector<vector<double>> TransformMatrix(vector<vector<double>> matrix) { vector<vector<double>> fullmatrix; vector<double> current; generateCartesian(matrix, 0, current, fullmatrix); return fullmatrix; }
方法二:迭代实现
迭代思路是从第一个子向量初始化结果,然后依次将结果与后续每个子向量做笛卡尔积,更新结果集。
#include <vector> using namespace std; vector<vector<double>> TransformMatrix(vector<vector<double>> matrix) { if (matrix.empty()) return {}; vector<vector<double>> result; // 初始化:第一个子向量的每个元素作为单独组合 for (double num : matrix[0]) { result.push_back({num}); } // 处理后续每个子向量 for (size_t i = 1; i < matrix.size(); ++i) { vector<vector<double>> temp; for (const auto& combo : result) { for (double num : matrix[i]) { vector<double> new_combo = combo; new_combo.push_back(num); temp.push_back(new_combo); } } result.swap(temp); // 替换为新的组合集 } return result; }
测试验证
用你的示例输入测试:
vector<vector<double>> matrix1{{10, 20, 30}, {1}, {2, 3}, {1}}; auto result = TransformMatrix(matrix1); // 输出结果会和你期望的完全一致
两种方法都能正确生成所有组合,递归写法更直观,迭代写法适合处理较大规模的输入(避免递归深度问题)。
内容的提问来源于stack exchange,提问作者jsmith
相关产品推荐
相关产品推荐

