gpt4 book ai didi

c++ - 通过更改代码格式计算结构 vector 中包含的双变量的平均值的不同结果?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:48:04 25 4
gpt4 key购买 nike

我目前正在与 OpenCV/C++ 的一个非常奇怪的行为作斗争。这就是我正在做的:

更新 1:这里有更多信息:

我计算一组像素的梯度方向,并将它们存储在自声明的 structdouble 字段中。结构元素存储在 vector 中。

myfunct1() {
(...)
c.grad_orientation = (sum_ori / highgrads.size()) + M_PI; // +M_PI because i just want to rotate the angle around 180°.
(...)
my_struct_vector.push_back(c);
}

我后来将几个 c 存储在一个 vector 中,并想估计每个 grad_orientation 的平均值,存储在我的 vector 的每个结构元素中,如下所示:

myfunct0() {
myfunct1(); //adds element to the my_struct_vector
(...)
int n = 0;
double total_ori = 0.0;
for (uint i = 0; i < my_struct_vector.size(); ++i) {
total_ori += my_struct_vector[i].grad_orientation;
n++;
}

azimuth = (total_ori / n);
cout << "Average: " << azimuth * 180/M_PI << endl; // print out in degrees
}

现在有趣的部分是:如果我在某些情况下这样做,cout 会打印 215.963。这是我最常得到的结果(正是这个结果)。在某些情况下,如果我添加上面命名的这些矩阵,或者(是的,真的)如果我将结构中保存 grad_orientation 的双字段移动到更高一列的代码,我得到 223.442。所以代码中的两个结果之间的差异如下:

struct my_struct {

std::vector<cv::Point> contour_shadow;
std::vector<cv::Point> contour_light;
cv::RotatedRect rect;
cv::Point pf;
cv::Point pc;
double grad_orientation; // this line moved one column down, beneath "grad_flag" results in a differing result.
bool grad_flag;
double grad_magnitude;

};

打印的结果不仅取决于列在结构声明中的位置,还取决于我更改代码的不同部分。

这可能与 double 有关,但为什么如果我移动代码列它会改变?

最佳答案

好的,感谢 Rolle 帮助我解决这个问题。我希望回答我自己的问题只是为了将其标记为已回答?
问题确实是在结构中使用了未初始化的内存和 bool 标志(之后是一个错误的决定)(当然,如果未初始化,则不是零)。事情很明显,但代码中行的交换(甚至在结构之外!)导致错误(但不知何故非随机)值的事实让我有点困惑。

请参阅此处 Are members of a C++ struct initialized to 0 by default?

关于c++ - 通过更改代码格式计算结构 vector 中包含的双变量的平均值的不同结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13341292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com