有点头痛,试图对3d向量中的元素求和。
它用于我当前正在编程的k均值算法;我理解并可以在纸上完成的算法,但从语法上讲,此刻我有点纠结。我可能会提到,这个项目是我第一次真正使用C ++处理复杂的容器。当前,我要计算群集中各点的新质心,这是通过平均群集中每个坐标的位置来完成的。我的3d向量设置为簇的向量,每个簇包含一个向量,该向量包含该簇中我坐标的向量(我希望听起来很清楚,希望我的代码可以减轻任何混乱)。目前,我正在尝试使用迭代器,但由于我觉得它们应该很重要,因此我正在考虑回到整数和索引,尽管我觉得应该学习这种语法的工作原理,因为它似乎很重要且功能强大。
我将仅发布我所坚持的功能以及与之相关的标头部分。如果您希望看到其他任何代码,我也很乐意根据要求将其放入,但是我认为这足以显示我的问题。
.h file parts (public members of class):
vector< vector < vector <float> > > clusters;
vector<vector<float> > avg;
int avgDiv;
.cpp file part with comments to help elaborate my query:
vector<vector<vector<float> > >::iterator threeD;
vector<vector<float> >::iterator row;
vector<float>::iterator col;
for (threeD = clusters.begin(); threeD != clusters.end(); threeD++) {
for (row = threeD->begin(); row != threeD->end(); row++) {
for(col = row->begin(); col != row->end(); col++){
//its this code below that is causing my headache,
//I know that what is written isn't correct,
//it is there to serve as an example of what I've
//been trying to do to sort out my issue.
avg.at(row) ( = or push_back ) ((clusters.at(row).at(col)) + (clusters.at(row+1).at(col)));
}
avgDiv = distance(row->begin(),row->end());
//divide each value in avg vector by the amount of members in row, giving the new centroid for that cluster, loop forward to next cluster. this isn't a problem I should think.
}
}
我的问题是编译器告诉我对“ at”的调用不是成员函数。现在,从其他问题中我可以看到,这是因为我没有通过正确的对象作为争论,但是,我确定我想将向量中迭代器所在的每个元素与该元素加在一起行中的下一个。
我已经尝试过并尽可能清楚地说明这一点,请询问,我会尽可能添加更多细节以帮助您回答。我对此并不陌生,很高兴接受批评。只会让我成为一个更好的程序员。感谢您的时间。
最佳答案
avg.at(index)
与整数索引一起使用,它只是带有边界检查的'c'array [index]表示法-顺便说一句,在实际代码中,您想使用[]或禁用速度检查。
但是row
是一个迭代器,实际上它已经是avg中指向该元素的指针,因此只需取消引用它即可获取值。*row = value of avg at position of iterator 'row'
有关C ++迭代器http://www.cprogramming.com/tutorial/stl/iterators.html的优秀教程
ps。使用向量和“数学”类型的代码,仅使用数组索引符号通常会更简单
关于c++ - 多维 vector C++的加法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9689232/