创建一个显示所有组合的函数

问题描述 投票:0回答:1

我在这里遇到麻烦,将不同长度的向量组成的向量转换为具有所有可能组合的矩阵。例如,我想要下面的

vector <vector <double>> matrix1{{10, 20, 30}, {1}, {2, 3}, {1}};

变成

{10, 1, 2, 1}
{10, 1, 3, 1}
{20, 1, 2, 1}
{20, 1, 3, 1}
{30, 1, 2, 1}
{30, 1, 3, 1}

我想出了下面的内容,这给了我上面的一些内容,但我显然错过了 c = 3 和 a = 20、c = 3 和 a = 30 的内容。

vector <vector <double>> TransformMatrix(vector<vector<double>> matrix)
{
    vector <vector <double>> fullmatrix;
    for (int a = 0; a < matrix[0].size(); a++)
    {
        vector <double> v1;
        v1.push_back(matrix[0][a]);
        v1.push_back(matrix[1][0]);
        v1.push_back(matrix[2][0]);
        v1.push_back(matrix[3][0]);
        fullmatrix.push_back(v1);
    }
    for (int b = 1; b < matrix[1].size(); b++)
    {
        vector <double> v1;
        v1.push_back(matrix[0][0]);
        v1.push_back(matrix[1][b]);
        v1.push_back(matrix[2][0]);
        v1.push_back(matrix[3][0]);
        fullmatrix.push_back(v1);
    
    }
....
}

这里有人有任何有用的提示/技巧吗?

c++ for-loop matrix vector combinations
1个回答
0
投票

您在这里尝试做的是获取 n 维笛卡尔积的输入。 常规的解决方案是编写迭代递归函数:

void cartesian_n_pick(const std::vector<std::vector<double>> &in,
                      std::vector<std::vector<double>> &out,
                      std::vector<double> &stack,
                      std::size_t i = 0)
{
    if (i >= in.size()) {
        out.push_back(stack);
        return;
    }
    for (double x : in[i]) {
        stack.push_back(x);
        cartesian_n_pick(in, stack, i + 1);
        stack.pop_back();
    }
}

int main() {
    std::vector<std::vector<double>> matrix = /* ... */;
    std::vector<std::vector<double>> combinations;
    std::vector<double> stack;
    cartesian_n_pick(in, combinations, stack);
}
© www.soinside.com 2019 - 2024. All rights reserved.