栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++使用matlab对点集矩阵运算加速

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++使用matlab对点集矩阵运算加速

需求:这里有两个三维点集矩阵,为点集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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/857116.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号