存储60维矢量的最佳方法 - C ++

时间:2015-11-30 15:03:41

标签: c++ vector

我试图在600个数据点上实现K-means聚类算法,所有数据点都有60个维度。一行输入将是:

28.7812 34.4632 31.3381 31.2834 28.9207 33.7596 25.3969 27.7849 35.2479 27.1159 32.8717 29.2171 36.0253 32.337  34.5249 32.8717 34.1173 26.5235 27.6623 26.3693 25.7744 29.27   30.7326 29.5054 33.0292 25.04   28.9167 24.3437 26.1203 34.9424 25.0293 26.6311 35.6541 28.4353 29.1495 28.1584 26.1927 33.3182 30.9772 27.0443 35.5344 26.2353 28.9964 32.0036 31.0558 34.2553 28.0721 28.9402 35.4973 29.747  31.4333 24.5556 33.7431 25.0466 34.9318 34.9879 32.4721 33.3759 25.4652 25.8717

我想有一个数据点结构,它有一个属性向量,比如

struct Point{
    std::vector<double> attributes;
};

我想在迭代所有点时,将i作为for循环中的迭代器加起来?这是解决这个问题的最好方法吗?

2 个答案:

答案 0 :(得分:5)

不确定您的要求,但使用C ++ 11,您可以使用std::array,这样您可能会有一些

 std::vector<std::array<double,60>> myvec;

然后myvec[2]myvec[10](假设myvec.size() > 10)都是std::array<double,60>类型的元素,因此您当然可以使用myvec[2][7]myvec[10][59]

答案 1 :(得分:1)

600个数据点是一个足够小的数字。在60维空间中查找距离,600点是大约36.000次操作。这是可管理的。

请记住,您的数据非常非常稀疏。 60个维度的更实际的数据集将具有更多的点。在这种情况下,您可能需要考虑预先分配空间。这会使您的数据结构复杂化。

一种中级技术是认识到距离只会加起来。在寻找点P的邻居时,需要计算到60维的第一个点的距离。这将建立下限D.但是当您计算到第二个点的距离时,您可能会发现在59个维度之后已经超过了D.现在最棘手的一点是,无法在添加每个维度后检查每个点;这将是过度的。您可能需要手动展开循环,具体取决于您的数据分布。