IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 均值漂移算法C++ -> 正文阅读

[数据结构与算法]均值漂移算法C++

自己写的 还没测试 记录一下

//均值漂移算法
void cal_shift(vector<vector<Point2i>>& point_class_times, vector<int>& used_point_idx, vector<int>& cur_class_idx, vector<Point2f>& cur_class_point, vector<Point2f> point_vec, Point2f center_point, Point2f& next_point, Point2f& shift_point, int radius, int class_idx)
{
?? ?vector<Point2f> cur_point_vec;
?? ?for (size_t i_nums = 0; i_nums < point_vec.size(); i_nums++)
?? ?{
?? ??? ?float dis = sqrt((center_point.x - point_vec[i_nums].x) * (center_point.x - point_vec[i_nums].x) + (center_point.y - point_vec[i_nums].y) * (center_point.y - point_vec[i_nums].y));
?? ??? ?if (dis < radius)
?? ??? ?{
?? ??? ??? ?cur_point_vec.push_back(point_vec[i_nums]);
?? ??? ??? ?point_class_times[i_nums][class_idx].y = point_class_times[i_nums][class_idx].y + 1;
?? ??? ??? ?vector<int>::iterator result = find(used_point_idx.begin(), used_point_idx.end(), i_nums);
?? ??? ??? ?if (result == used_point_idx.end())
?? ??? ??? ?{
?? ??? ??? ??? ?used_point_idx.push_back(i_nums);
?? ??? ??? ?}
?? ??? ??? ?vector<int>::iterator result_class = find(cur_class_idx.begin(), cur_class_idx.end(), i_nums);
?? ??? ??? ?if (result_class == cur_class_idx.end())
?? ??? ??? ?{
?? ??? ??? ??? ?cur_class_idx.push_back(i_nums);
?? ??? ??? ??? ?cur_class_point.push_back(point_vec[i_nums]);
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?for (size_t i_nums = 0; i_nums < cur_point_vec.size(); i_nums++)
?? ?{
?? ??? ?Point2f cur_vec;
?? ??? ?cur_vec.x = cur_point_vec[i_nums].x - center_point.x;
?? ??? ?cur_vec.y = cur_point_vec[i_nums].y - center_point.y;
?? ??? ?shift_point.x = shift_point.x + cur_vec.x;
?? ??? ?shift_point.y = shift_point.y + cur_vec.y;
?? ?}
?? ?shift_point.x = shift_point.x / float(cur_point_vec.size());
?? ?shift_point.y = shift_point.y / float(cur_point_vec.size());
?? ?next_point.x = center_point.x + shift_point.x;
?? ?next_point.y = center_point.y + shift_point.y;
}


void Mean_shift(vector<Point2f> point_vec)
{
?? ?srand((int)time(0));


?? ?vector<Point2f> check_point_vec = point_vec;


?? ?vector<vector<Point2f>> result_point;
?? ?vector<vector<Point2i>> point_class_times;
?? ?point_class_times.resize(point_vec.size());


?? ?int radius = 5;
?? ?int class_idx = 0;

?? ?vector<int> used_point_idx;

?? ?vector<vector<Point2f>> class_point_vec;
?? ?vector<vector<int>> class_point_idx_vec;

?? ?bool last_times_insert = false;
?? ?vector<Point2f> class_mean_vec;
?? ?while (true)
?? ?{
?? ??? ?int rand_first = rand() % check_point_vec.size();
?? ??? ?Point2f first_point = check_point_vec[rand_first];
?? ??? ?check_point_vec.clear();
?? ??? ?Point2f next_point;
?? ??? ?Point2f shift_point(0, 0);
?? ??? ?for (size_t i_nums = 0; i_nums < point_class_times.size(); i_nums++)
?? ??? ?{
?? ??? ??? ?point_class_times[i_nums].push_back(Point2i(class_idx, 0));
?? ??? ?}


?? ??? ?vector<int> cur_class_idx;
?? ??? ?vector<Point2f> cur_class_point;
?? ??? ?while (true)
?? ??? ?{
?? ??? ??? ?cal_shift(point_class_times, used_point_idx, cur_class_idx, cur_class_point, point_vec, first_point, next_point, shift_point, radius, class_idx);
?? ??? ??? ?if (point_dis(first_point, next_point) < 1)
?? ??? ??? ?{
?? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ??? ?first_point = next_point;
?? ??? ??? ?next_point.x = 0;
?? ??? ??? ?next_point.y = 0;
?? ??? ?}


?? ??? ?Point2f cur_class_mean;
?? ??? ?Point2f cur_class_sum;
?? ??? ?for (size_t i_nums = 0; i_nums < cur_class_point.size(); i_nums++)
?? ??? ?{
?? ??? ??? ?cur_class_sum.x += cur_class_point[i_nums].x;
?? ??? ??? ?cur_class_sum.y += cur_class_point[i_nums].y;
?? ??? ?}

?? ??? ?cur_class_mean.x = cur_class_sum.x / float(cur_class_point.size());
?? ??? ?cur_class_mean.y = cur_class_sum.y / float(cur_class_point.size());

?? ??? ?if (0 == class_mean_vec.size())
?? ??? ?{
?? ??? ??? ?class_mean_vec.push_back(cur_class_mean);
?? ??? ??? ?class_point_vec.push_back(cur_class_point);
?? ??? ??? ?class_point_idx_vec.push_back(cur_class_idx);
?? ??? ??? ?class_idx++;
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?bool chk_insert = false;
?? ??? ??? ?for (size_t i_nums = 0; i_nums < class_mean_vec.size(); i_nums++)
?? ??? ??? ?{
?? ??? ??? ??? ?float dis = point_dis(cur_class_mean, class_mean_vec[i_nums]);
?? ??? ??? ??? ?if (dis < 3)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?chk_insert = true;
?? ??? ??? ??? ??? ?for (size_t j_nums = 0; j_nums < cur_class_idx.size(); j_nums++)
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?point_class_times[cur_class_idx[j_nums]][i_nums].y = point_class_times[cur_class_idx[j_nums]][i_nums].y + 1;?? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ??? ?vector<int>::iterator result = find(class_point_idx_vec[i_nums].begin(), class_point_idx_vec[i_nums].end(), cur_class_idx[j_nums]);
?? ??? ??? ??? ??? ??? ?if (result == class_point_idx_vec[i_nums].end())
?? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ?class_point_vec[i_nums].push_back(point_vec[cur_class_idx[j_nums]]);
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?Point2f new_class_mean;
?? ??? ??? ??? ??? ?Point2f new_class_sum;
?? ??? ??? ??? ??? ?for (size_t j_nums = 0; j_nums < class_point_vec[i_nums].size(); j_nums++)
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?new_class_sum.x += class_point_vec[i_nums][j_nums].x;
?? ??? ??? ??? ??? ??? ?new_class_sum.y += class_point_vec[i_nums][j_nums].y;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?new_class_mean.x = new_class_sum.x / (float(class_point_vec[i_nums].size()));
?? ??? ??? ??? ??? ?new_class_mean.y = new_class_sum.y / (float(class_point_vec[i_nums].size()));
?? ??? ??? ??? ??? ?class_mean_vec[i_nums] = new_class_mean;
?? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?if (false == chk_insert)
?? ??? ??? ?{
?? ??? ??? ??? ?class_mean_vec.push_back(cur_class_mean);
?? ??? ??? ??? ?class_point_vec.push_back(cur_class_point);
?? ??? ??? ??? ?class_point_idx_vec.push_back(cur_class_idx);
?? ??? ??? ??? ?class_idx++;
?? ??? ??? ?}
?? ??? ?}

?? ??? ?class_point_vec.push_back(cur_class_point);
?? ??? ?for (size_t i_nums = 0; i_nums < point_vec.size(); i_nums++)
?? ??? ?{
?? ??? ??? ?vector<int>::iterator result = find(used_point_idx.begin(), used_point_idx.end(), i_nums);
?? ??? ??? ?if (result == used_point_idx.end())
?? ??? ??? ?{
?? ??? ??? ??? ?check_point_vec.push_back(point_vec[i_nums]);
?? ??? ??? ?}
?? ??? ?}


?? ??? ?if (used_point_idx.size() == point_vec.size())
?? ??? ?{
?? ??? ??? ?break;
?? ??? ?}
?? ?}

}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:54:13  更:2022-05-18 17:56:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:44:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码