You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写生成所有组合的函数:将变长向量组转换为组合矩阵

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:53:11