小白之matlab c++混合编程
来源:互联网 发布:建筑规范软件有哪些 编辑:程序博客网 时间:2024/06/08 00:26
matlab c++混合编程
- 目的:尝试c++与matlab混合编程,用c++编写关键代码,matlab编译后可以调用,主要用在瓶颈以提高速度。
- 功能:实现两个矩阵间,成对样本点的欧氏距离计算。
- 注:在matlab中已经有pdist(),pdist2()函数可以快速的实现相应的功能,这里只做练习。
/************************************************************************//* mex函数:实现c++与matlab混合编程,程序实现成对样本点的欧式距离的平方的计算 *//* 注:为了快速计算,求根操作没有实现,需要在该函数调用后,在MATLAB中进行求根运算*//************************************************************************/#include "mex.h"#define Matrix1(row,col) Matrix1[col*n+row]#define Matrix2(row,col) Matrix2[col*n+row]#define Matrix_out(row,col) Matrix_out[col*m1+row]void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){ //参数检查 if (nrhs != 2) { mexErrMsgTxt("输入参数只能是两个矩阵"); } if (nlhs > 1) { mexErrMsgTxt("输出参数只能为一个矩阵"); }#define INT_1 prhs[0]#define INT_2 prhs[1]#define OUT plhs[0] double *Matrix1, *Matrix2,*Matrix_out; int n, m1, m2,ri,ci,rni; m1 = mxGetN(INT_1); m2 = mxGetN(INT_2); n = mxGetM(INT_1); if (mxGetM(INT_2) != n) { mexErrMsgTxt("两个输入矩阵的行数必须相同"); } Matrix1 = mxGetPr(INT_1); Matrix2 = mxGetPr(INT_2); //OUT = mxCreateDoubleMatrix(m1, m2, mxREAL); OUT = mxCreateUninitNumericMatrix(m1, m2, mxDOUBLE_CLASS, mxREAL);//创建未初始化的矩阵,可以加速 Matrix_out = mxGetPr(OUT);//距离计算 for (ri=0;ri<m1;ri++) { for (ci=0;ci<m2;ci++) { double temp = 0; for (rni = 0; rni < n; rni++) { //这里不要用pow(),很慢 double sub = (Matrix1(rni, ri) - Matrix2(rni, ci)); temp += sub * sub; }//这里没有求根 Matrix_out(ri, ci) = temp; } }}
测试:
a=rand(1024,4000);b=rand(5000,1000);ticaa=pdist2(a',a','euclidean');%自带的对距离计算函数,核心调用pdist2mextocticbb=pdistmex(a,'euc',[],[],[]);bb=squareform(bb);%自带的对距离计算函数,核心调用pdist2mextoc% tic% c=DistMatrix(a',b');% toc% tic% cc=mypdist(a,b);% toc% tic% ccc=disPoint(a',b');% tocticaa=pdist2(a',b','euclidean');%自带的对距离计算函数,核心调用pdist2mextoc% aa=pdist(a');%aa是一个向量,包含下三角矩阵的值% aa=squareform(aa);ticbb=pdist2mex(a,b,'euc',[],[],[]);%自带的mex函数速度更快tocticcc=mysecondpdist(a,b);cc=sqrt(cc);%自己的,速度慢,求根运算不在其中toc
效果:速度不如matlab自带的pdist2()函数,大概是其1/5,另外,pdist2()函数的核心是调用经编译的pdist2mex.mexw64文件,路径:D:\Program Files\MATLAB\R2017a\toolbox\stats\stats\private。速度最快。
参考资料:
https://stackoverflow.com/questions/19253405/pairwise-distance-calculation-in-c 优化代码提高速度
http://blog.sciencenet.cn/blog-531885-589056.html matlab中pdist()和pdist2()函数的使用方法
http://www.getreuer.info/ Pascal Getreuer的两本书 Writing Fast MATLAB Code和Writing MATLAB C/MEX Code
http://blog.sciencenet.cn/blog-43777-320103.html mexFunction函数相关
阅读全文
0 0
- 小白之matlab c++混合编程
- Matlab C混合编程
- matlab C混合编程
- Matlab C混合编程
- matlab/C 混合编程
- Matlab和C混合编程
- matlab与C混合编程
- c和matlab混合编程
- matlab与c混合编程
- matlab与C混合编程
- C和MATLAB混合编程
- MATLAB与C混合编程
- matlab与c混合编程
- Matlab C/C++ 混合编程
- Matlab、C++、OpenCV混合编程
- Matlab C混合编程配置
- c与matlab混合编程之dll调用
- matlab与C语言混合编程之openmp多线程
- 算法设计周记(一)--大数加法
- 线程之间的通信
- 【LeetCode】345. Reverse Vowels of a String
- LeetCode 657. Judge Route Circle (Easy)
- JDBC批处理addBatch
- 小白之matlab c++混合编程
- 如何调整CodeIgniter的报错级别
- 多态及虚函数
- centos elasticsearch安装与配置
- OpenJudge百炼-2764-数根-C语言-高精度计算
- java温度转换水仙花数阶乘
- semaphore
- 前端之js-属性与方法
- 2017 ACM/ICPC Asia Regional Shenyang Online 1004 & hdu6197:array array array