Matlab的intersect函数的C++实现
来源:互联网 发布:农村淘宝面试和答案 编辑:程序博客网 时间:2024/06/03 19:42
Matlab的Intersect函数是求两个向量的交集,默认是对数据进行排序。
与setdiff函数类似,C++STL中也有set_intersection函数实现交集的功能,与setdiff转成C++类似,也需要几个步骤来得到最后一致的结果:
1、先对向量进行sort排序;
2、声明一个vector对象,大小为两个向量最长的那个值(保证向量的长度足够),使用set_intersection求交集,代码片段如下:
vector<int> v;
vector<int>::iterator it;
v.resize(ANumber>BNumber ? ANumber : BNumber);
it = set_intersection(arrayA[0], arrayA[0]+ANumber, arrayB[0], arrayB[0]+BNumber, v.begin());
3、set_intersection函数只是把两个向量的相同元素找出来并排列,不同的元素排列在最后一个相同元素后面,使得向量的长度并不变。如A[5]={1,1,2,3,4},B[3]={1,3,5},声明的vector是C,size是5,结果为C={1,1,3,2,4}
4、所以需要将vector截断,只保留相同元素的部分,利用第2步里的it,对vector进行resize:v.resize(it-v.begin());
5、对vector对象进行去重(unique)操作。与set_difference类似,转换成动态数组进行操作。
6、转换为自己的数据格式,得到和Matlab一样的结果。
整个代码如下,CIPPmatrix_I是自定义的二维数组:(应该有不必要的格式转换,还是对C++ STL不熟悉)
CIPPMatrix_I Method::InterSection(CIPPMatrix_I arrayA, CIPPMatrix_I arrayB)
{
assert(arrayA.Height() == 1 && arrayA.Width() >= 1 && arrayB.Height() == 1 && arrayB.Width() >=1);
int ANumber = arrayA.Width();
int BNumber = arrayB.Width();
sort(arrayA[0],arrayA[0]+ANumber);
sort(arrayB[0], arrayB[0]+BNumber);
vector<int> v;
vector<int>::iterator it;
v.resize(ANumber>BNumber ? ANumber : BNumber);
it = set_intersection(arrayA[0], arrayA[0]+ANumber, arrayB[0], arrayB[0]+BNumber, v.begin());
v.resize(it-v.begin());
int* newarray = new int[v.size()];
int count = 0;
for(it=v.begin(); it!=v.end();++it)
{
newarray[count] = *it;
count++;
}
int* uniqueresult = unique(newarray, newarray+v.size());
vector<int> la(newarray, uniqueresult);
CIPPMatrix_I result(1,la.size());
vector<int>::iterator itunique;
count = 0;
for(itunique=la.begin(); itunique!=la.end();++itunique)
{
result[0][count] = *itunique;
count++;
}
delete[] newarray;
vector<int>().swap(v);
vector<int>().swap(la);
return result;
}
- Matlab的intersect函数的C++实现
- matlab2c使用c++实现matlab函数系列教程-intersect函数
- C语言实现matlab的butter函数
- AE intersect、clip的实现
- matlab的函数conv()的C语言实现
- setdiff 和intersect 函数的用法
- mcc函数实现matlab的m文件转化为c
- matlab 与C语言关于filter函数的实现
- matlab中滤波器函数filter的C语言实现
- MATLAB中filter函数的C代码实现
- c语言实现matlab上的filter函数
- MySQL实现Oracle的Intersect 和 Minus
- MySQL实现Oracle的Intersect 和 Minus
- MATLAB实现的FFT函数
- matlab的Reshape函数实现
- matlab intersect
- Matlab--intersect
- SQL INTERSECT的用法
- 笔记本电脑配置:选择独立显卡还是集成显卡
- LeetCode——Plus One
- PHP开发安全问题总结
- 用VS调试dump的几个问题
- Unity游戏开发中会用到的插值方法,取自项目中的Interpolate.cs
- Matlab的intersect函数的C++实现
- 关于宽字节编码导致的web安全问题
- 就像我们的青春一样
- InetAddress类的一些方法
- JVM日志和参数的理解
- cocos2dx Bezier 曲线 长度
- linux du和df
- 利用${}对字符串进行相关操作
- Fragment真正意义上的onResume和onPause