2

我正在尝试使用 VLFeat 中的库函数,该函数要求数据为 const void *。我真的不明白如何创建数据然后将其传入。

这是函数调用

void vl_kmeans_init_centers_with_rand_data  (VlKMeans * self, void const * data,
    vl_size dimension, vl_size numData, vl_size numCenters)

数据论点是让我感到震惊的论点。我尝试构建一个随机数据矩阵来测试kmeans 聚类函数,但我不知道如何使用这些数据。换句话说,这个函数需要这个参数。但要使其有用,我必须了解如何投射/创建/加载数据以使其工作。这意味着,我需要了解const void *参数中类型的目的。

任何帮助将不胜感激。

注意:我确实理解 const 的含义,但是,例如,我不知道如何迭代地构建 const 数据(即用双 for 循环填充矩阵)

谢谢!

4

2 回答 2

11

const,尽管标准化委员会尽最大努力让您感到困惑,但这并不意味着“恒定”。这意味着“只读”。

通过将其参数声明为指向- 的指针const,此函数声明您的数据不会在其进入的过程中被复制,但函数的代码将只能读取它,而不能修改它。

因此,只需以常规方式构建您的矩阵(非const,因为需要使用循环来完成它),然后将其传入,确信它会返回不变。

除非...函数的代码抛弃了 const。这应该让写它的人立即被解雇。

于 2015-02-04T21:08:36.217 回答
2

const唯一意味着vl_kmeans_init_centers_with_rand_data不允许修改该数据。即不必使用const数组,您可以传递一个“正常”(可变)数组。const总是可以通过隐式转换添加 - 不是相反。

(允许添加 const:一个函数可能总是承诺不修改一个对象,即使它可以被修改。不允许删除 const:一个函数不能修改一个对象,或者将它交给另一个需要修改对象的函数,如果原始函数已在不会修改对象的承诺下被赋予对象。)

void当用作指针的类型时,表示“任何东西”。即,您可以将 int-pointer 转换为 void-pointer,将 double-pointer 转换为 void-pointer - 任何您喜欢的指针转换为 void-pointer。其原因是,大多数情况下,采用 void-pointer 参数的函数可以处理不同的数据类型。在这种情况下,VlKMeans有一个成员dataType可能控制vl_kmeans_init_centers_with_rand_data函数如何解释data参数。

假设 egdataType设置为VL_TYPE_DOUBLE,这应该有效:

std::vector<double> data(numData);
// fill 'data' with data
vl_kmeans_init_centers_with_rand_data(vlkMeans, &data[0], dimension, numData, numCenters);
于 2015-02-04T21:22:43.183 回答