
使用猪八戒APP
随时随地享服务
编写C++代码调用nmslib找k近邻
conan nmslib/2.1.1库:https://conan.io/center/nmslib nmslib/2.1.1 github:https://github.com/nmslib/nmslib需求: 我有一段python代码: def knn_nmslib(feats, k, space='cosinesimil'): index = nmslib.init(method='hnsw', space=space) # 空间名是cosinesimil,搜索方法是hnsw index.addDataPointBatch(feats) # 添加数据 index.createIndex({'post': 2}, print_progress=False) # 创建索引,不需要打印过程 neighbours = index.knnQueryBatch(feats, k=k, num_threads=multiprocessing.cpu_count()) # 查询k近邻,多进程执行 return neighbours 现在需要转为C++的代码,我尝试进行了,但是不对,下面是我的错误C++代码: //c++ void knn_nmslib(const std::vector<std::vector<float>>& feats, std::vector<std::pair<std::vector<int>, std::vector<float>>>& neighbours, int k) { // 初始化空间 std::shared_ptr<similarity::Space<float>> space = std::make_shared<similarity::CosineSimilarity>(); // 初始化索引 std::shared_ptr<Index<float>> index = std::make_shared<Index<float>>(space, "hnsw"); // 设置索引参数 index->SetQueryTimeParams(Params()); // 添加数据 for (auto& feat : feats) { index->AddDataPoint(feat); } // 创建索引 index->CreateIndex(Params()); // 查询k近邻 for (auto& feat : feats) { std::vector<std::pair<int, float>> result; index->SearchKnn(feat, k, result); std::vector<int> idx; std::vector<float> dist; for (auto& r : result) { idx.push_back(r.first); dist.push_back(r.second); } neighbours.push_back(std::make_pair(idx, dist)); } }即我拥有n个特征向量,我想用nmslib求每个特征向量的k个近邻是谁。此外,如果不用此库,这个C++代码可以这样写是没错的: float findCosineSimilarity(std::vector<float> source_representation, std::vector<float> test_representation) { float a = 0.0f; float b = 0.0f; float c = 0.0f; for (int i = 0; i < source_representation.size(); i++) { a += source_representation[i] * test_representation[i]; b += source_representation[i] * source_representation[i]; c += test_representation[i] * test_representation[i]; } return (a / (std::sqrt(b) * std::sqrt(c) + 0.000001f)); }float findCosineDistance(std::vector<float> source_representation, std::vector<float> test_representation) { return 1.0f - findCosineSimilarity(std::move(source_representation), std::move(test_representation)); } void knn_nmslib(std::vector<std::vector<float>> feats, std::vector<std::pair<std::vector<int>, std::vector<float>>> &neighbours, int k) { std::vector<std::vector<int>> indexs; std::vector<std::vector<float>> dist; //计算feats中两两距离 std::map<std::pair<int, int>, float> distance22; for (int i = 0; i < feats.size(); i++) { for (int j = i + 1; j < feats.size(); j++) { distance22[std::make_pair(i, j)] = findCosineDistance(feats[i], feats[j]); distance22[std::make_pair(j, i)] = distance22[std::make_pair(i, j)]; } } //相同index 作为pair给距离0.0f for (int i = 0; i < feats.size(); i++) distance22[std::make_pair(i, i)] = 0.0f; //为feats中每个特征,选择距离最近的k个特征,包含自己(距离是0) for (int i = 0; i < feats.size(); i++) { std::vector<std::pair<int, float>> distance2; for (int j = 0; j < feats.size(); j++) { distance2.emplace_back(j, distance22[std::make_pair(i, j)]); } //以最小的时间复杂度找到distance2中最小的k个元素 std::partial_sort(distance2.begin(), distance2.begin() + k, distance2.end(), [](const std::pair<int, float> &a, const std::pair<int, float> &b) { return a.second < b.second; }); std::vector<int> index; std::vector<float> dis; for (int j = 0; j < k; j++) { index.push_back(distance2[j].first); dis.push_back(distance2[j].second); } indexs.push_back(index); dist.push_back(dis); } for (int i = 0; i < indexs.size(); i++) { neighbours.emplace_back(indexs[i], dist[i]); } }
¥500 查看详情
leaflet调用arcgis maps
arcgis已经发布好了mapserver,但是不知道为什么不能在leaflet中调用显示。代码如下: L.esri.dynamicMapLayer({url: "http://XX.17.26.XX:8081/server/rest/services/XXXX/XXXXX/MapServer/"}).addTo(map); L.esri.dynamicMapLayer({url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer"}).addTo(map);
¥50 - 100元 查看详情
调用 web service 时获取参数
我不太懂 asp.net的代码 我通过 asp.net 网站 (这个网站我也可以进去)来调用 另一个 asp.net 的 web service (架在iis服务器上) (这台电脑我可以进去)上的方法 我想获取调用时的参数字符串, 我通过 iis 服务器的日志 只能获取到 post请求的url,但是我无法获取到 post 提交的参数! 请问如何获取 调用时的参数字符串!
¥20 查看详情
Electron 调用 DLL的例子
Electron 调用windows DLL的例子需求说明 1. Electron 调用摄像头, 可以实时预览, 预览时调用我们提供的DLL文件, DLL的作用是对摄像头画面做抠图. 2. 把抠图后的画面实时显示出来. 3. 需要用NodeJS +Electron+ Vue; 4. 我们提供C#调用DLL的例子, 从而确保DLL是可以正常工作的. 5. 做好后,界面就显示原始画面和抠图画面 6. 我们的SDK是一个很简单的调用,即:初始化、抠图一帧画面 (raba输入,宽度,高度,raba输出)、释放 7. 交付后提供源码工程
¥6000 查看详情
用VB.net 调用 打印机属性
在excel中可以在打印时点击【打印机属性】按钮,调出打印机属性对话框,点确定后,就可以按刚才指定的属性进行打印。我想在我我程序中也可以点击【打印机属性】按钮,调出打印机属性对话框,点确定后,就可以按刚才指定的属性进行打印。但我只能通过api调出这个对话框,修改里面选项并点确定后却无效果,希望能帮助写出这段代码。用VB.net 或C# (基于.net framework 的winForm语法)
¥300 查看详情
调用excel数据录入
我们现在是用excel进行产品bom录入,数据的正确性无法控制,希望,在表格输入内容时,进行联想提示,比如输入笔,会就显示铅笔,钢笔,圆珠笔,而联想提示的内容来至于数据库,有做过的请联系我详谈。
¥1000 查看详情