如何实现此过程

时间:2015-03-09 21:54:19

标签: c++ algorithm

我已经实现了这个问题的第一部分但未能实现第二部分。我想要做的是我有两个向量

std::vector<double> A = {1,1,2,2};
std::vector<double> B = {3,3,4,4,5,5};

我必须经历两个循环并减去两个数学向量。例如,

第一次迭代:

C = [1;1] (Note: the first two elements of A vector)

因为C是2x1,我必须从B构造三个相同大小的数学向量,因此第一次迭代的输出是

1 - 3
1 - 3
------
1 - 4
1 - 4
------
1 - 5
1 - 5

对于第二次迭代,C矩阵每次迭代扩展两个元素,因此新的C矩阵为C = [1;1;2;2]。现在我们需要再次进行减法,第二次迭代的输出是

1 - 3
1 - 3
2 - 4
2 - 4
------
1 - 4
1 - 4
2 - 5
2 - 5
------
1 - 5
1 - 5
2 - 3
2 - 3 

如您所见,第二个数学向量被移动了两个元素,其中第一个数学向量保持原样。 A和B矩阵具有这个假设size % 2 = 0,其中2是C矩阵的大小。

1 个答案:

答案 0 :(得分:1)

复制你的输出,首次迭代你会得到:

std::vector<double> A = {1,1,2,2};
std::vector<double> B = {3,3,4,4,5,5};
std::vector<double> C (A.begin(), A.begin()+2);

// bg - index of group of 2 elements in B
for (int bg = 0; bg < 3; ++bg) {
  for (int ci = 0; ci < int(C.size()); ++ci) {
    // bi - index of element in B
    int bi = (2*bg + ci) % int(B.size());
    std::cout << C[ci] << " - " << B[bi] << std::endl;
  }
  std::cout << "------" << std::endl;
}

对于第二次迭代,您必须更改一行:

// line changed...
std::vector<double> C (a.begin(), a.begin()+4);

编辑:好的,这是更通用的表单,它输出您为迭代计数器it的更改指定的两种情况。希望它在扩展向量时有效。

for (int it = 1; it <= int(A.size())/2; ++it) {
  std::vector<double> C (A.begin(), A.begin()+it*2);

  // bg - index of group of 2 elements in B
  for (int bg = 0; bg < int(B.size())/2; ++bg) {
    for (int ci = 0; ci < int(C.size()); ++ci) {
      // bi - index of element in B
      int bi = (2*bg + ci) % int(B.size());
      std::cout << C[ci] << " - " << B[bi] << std::endl;
    }
    std::cout << "------" << std::endl;
  }
  std::cout << std::endl;
}