c++向量逐元素除法



我正在尝试用C++进行一些简单的计算,我用嵌套的for循环进行了计算,这还可以。

std::vector<int16_t> roi_1(ROI_WIDTH * ROI_HEIGHT);
std::vector<int16_t> roi_2(ROI_WIDTH * ROI_HEIGHT);
std::vector<int16_t> roi_3(ROI_WIDTH * ROI_HEIGHT);
std::vector<int16_t> roi_4(ROI_WIDTH * ROI_HEIGHT);
std::vector<int16_t> roi_5(ROI_WIDTH * ROI_HEIGHT);
std::vector<int16_t> roi_6(ROI_WIDTH * ROI_HEIGHT);
std::vector<int16_t> roi_7(ROI_WIDTH * ROI_HEIGHT);

std::vector<int16_t> numerator(ROI_WIDTH * ROI_HEIGHT);
std::vector<int16_t> denominator(ROI_WIDTH * ROI_HEIGHT);
std::vector<float_t> phi(ROI_WIDTH * ROI_HEIGHT);

memcpy(&roi_1[row*ROI_WIDTH], &ptr[(row+ROI_OFFSET_Y)*stride_pixels + ROI_OFFSET_X], ROI_WIDTH * sizeof(int16_t));
memcpy(&roi_2[row*ROI_WIDTH], &ptr[(row+ROI_OFFSET_Y)*stride_pixels + ROI_OFFSET_X], ROI_WIDTH * sizeof(int16_t));
memcpy(&roi_3[row*ROI_WIDTH], &ptr[(row+ROI_OFFSET_Y)*stride_pixels + ROI_OFFSET_X], ROI_WIDTH * sizeof(int16_t));
memcpy(&roi_4[row*ROI_WIDTH], &ptr[(row+ROI_OFFSET_Y)*stride_pixels + ROI_OFFSET_X], ROI_WIDTH * sizeof(int16_t));
memcpy(&roi_5[row*ROI_WIDTH], &ptr[(row+ROI_OFFSET_Y)*stride_pixels + ROI_OFFSET_X], ROI_WIDTH * sizeof(int16_t));
memcpy(&roi_6[row*ROI_WIDTH], &ptr[(row+ROI_OFFSET_Y)*stride_pixels + ROI_OFFSET_X], ROI_WIDTH * sizeof(int16_t));
memcpy(&roi_7[row*ROI_WIDTH], &ptr[(row+ROI_OFFSET_Y)*stride_pixels + ROI_OFFSET_X], ROI_WIDTH * sizeof(int16_t));

//Calculate the numerator and denominator and phase angle...
for (unsigned int m = 0; m < ROI_HEIGHT ; m++)
{
for(unsigned int n = 0; n < ROI_WIDTH ; n++)
{
numerator[m * ROI_WIDTH + n] = C2 * roi_2[m * ROI_WIDTH + n] - C4 * roi_4[m * ROI_WIDTH + n] + roi_6[m * ROI_WIDTH + n];
denominator[m * ROI_WIDTH + n] = C3 * roi_3[m * ROI_WIDTH + n] - C5 * roi_5[m * ROI_WIDTH + n] + roi_7[m * ROI_WIDTH + n] - roi_1[m * ROI_WIDTH + n];
phi[m * ROI_WIDTH + n] = atan2(numerator[m * ROI_WIDTH + n], denominator[m * ROI_WIDTH + n]);
}
}

然而,我想用矢量进行计算,但下面的代码没有提供相同的结果?有人能帮忙吗?谢谢

transform(numerator.begin(), numerator.end(), numerator.begin(), [&](const auto &i){return C2*roi_2[i] - C4*roi_4[i] + roi_6[i];});
transform(denominator.begin(), denominator.end(), denominator.begin(), [&](const auto &i){return C3*roi_3[i] - C5*roi_5[i] + roi_7[i] - roi_1[i];});
transform(phi.begin(), phi.end(), phi.begin(), [&](const auto &i){return atan2(numerator[i], denominator[i]);});
std::transformunary_op获取输入值,而不是索引。我认为它在所有情况下都会得到i = 0。您可以使用索引预先填充向量。
std::iota(numerator.begin(), numerator.end(), 0);
std::iota(denominator.begin(), denominator.end(), 0);
std::iota(numerator.begin(), numerator.end(), 0);
std::transform(phi.begin(), phi.end(), numerator.begin(), [&](const auto &i){return C2*roi_2[i] - C4*roi_4[i] + roi_6[i];});
std::transform(denominator.begin(), denominator.end(), denominator.begin(), [&](const auto &i){return C3*roi_3[i] - C5*roi_5[i] + roi_7[i] - roi_1[i];});
std::transform(phi.begin(), phi.end(), phi.begin(), [&](const auto &i){return atan2(numerator[i], denominator[i]);});

最新更新