我在这里遇到麻烦,将不同长度的向量组成的向量转换为具有所有可能组合的矩阵。例如,我想要下面的
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);
}
....
}
这里有人有任何有用的提示/技巧吗?
您在这里尝试做的是获取 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);
}