需求:这里有两个三维点集矩阵,为点集A中的每一个点在点集B中找到最近点。
通过构建距离矩阵实现这个需求。
方法1:使用c++的第三方库eigen,构建矩阵。
方法2:c++和matlab混合编程,将数据传递到matlab运算,将运算结果进行返回。
当点集为300和1000000时,构建一个300*1000000的距离矩阵,c++的第三方库共运行400秒左右,而matlab只需要2秒。
下面是C++端的代码,需要将点集转换为vector
if (Distance_Between_Two_Point_SetsInitialize()&&Distance_Between_Two_Point_Sets_with_indexInitialize()) //必须的要初始化,格式为 名字Initialize()
{
cout << "成功" << endl;
}
else
{
cout << "失败" << endl;
return 0;
}
//定义3个mwArray类型变量,用于存放矩阵
vector aaa;
aaa.push_back(1.0);
aaa.push_back(2.0);
aaa.push_back(3.0);
aaa.push_back(3.0);
aaa.push_back(1.0);
aaa.push_back(2.0);
aaa.push_back(1.0);
aaa.push_back(2.0);
aaa.push_back(3.0);
aaa.push_back(1.0);
aaa.push_back(2.0);
aaa.push_back(3.0);
vector bbb;
bbb.push_back(2.0);
bbb.push_back(3.0);
bbb.push_back(4.0);
bbb.push_back(2.0);
bbb.push_back(3.0);
bbb.push_back(4.0);
bbb.push_back(1.1);
bbb.push_back(2.0);
bbb.push_back(3.0);
int lenth_a = aaa.size() / 3;
int lenth_b = bbb.size() / 3;
mwArray a(3,lenth_a, mxDOUBLE_CLASS);
mwArray b(3,lenth_b, mxDOUBLE_CLASS);
mwArray c(3,4, mxDOUBLE_CLASS);
double *sum = new double[12]; //注意这个是指针
// 给输入 mxArray 对象赋值
a.SetData(aaa.data(), 12);
b.SetData(bbb.data(), 9);
//调用DLL函数
Distance_Between_Two_Point_Sets(1, c, a, b);
//获取结果
c.GetData(sum, 12);
mwArray d(4, 1, mxINT16_CLASS);
int *index = new int[bbb.size()]; //注意这个是指针
Distance_Between_Two_Point_Sets_with_index(1, d, a, b);
d.GetData(index, 4);
//输出结果
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
cout << sum[j * 4 + i] << "t";
cout << endl;
}
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 1; j++)
cout << index[j * 4 + i] << "t";
cout << endl;
}
下面是matlab端的代码:
function [index]=Distance_Between_Two_Point_Sets_with_index(DataA,DataB)
B=DataA.';
P=DataB.';
B1=sum(B.^2,2);
P1=sum(P.^2,2);
Num_b=numel(B1);
Num_p=numel(P1);
Dis_matrix= repmat(B1,1,Num_p) + repmat(P1',Num_b,1) - 2*B*P'; % Num_b * Num_P distance matrix;
[min_a,index]=min(Dis_matrix,[],2);
return ;
end


