资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,VC和Matlab混合编程总结,同山,2007.10.14.,1,引言,对于计算机图形学的研究,有一些工具软件是我们需要了解和掌握的:,Visual C+,Matlab,ACIS,2,引言,Visual C+,基本的编程实现平台(&OpenGL),编译语言,代码运行速度快,可脱离开发平台运行,易于工程中使用,代码编制复杂,不适合算法设计初期使用,缺少通用的常用数值运算功能(矩阵),3,引言,Matlab,解释语言,易于实现,适用于算法设计,具有常用的数值运算功能,代码运行速度慢,不能脱离Matlab开发平台运行,4,对比,在VC中实现二维矩阵的存储和输出:,矩阵相加,相乘,求逆,稀疏矩阵,double matrix33 = 1,2,3,4,5,6,7,8,9;,for (int i=0;i3;i+),for (int j=0;j3;j+),coutmatrixij ;,coutn;,5,对比,在Matlab中实现二维矩阵的相关操作,但是Matlab运行速度要比VC慢几百倍,a = 1 2 3;4 5 6;7 8 9;,b = 2*a,c = a*b,inv(a),sparse(a),矩阵初始化赋初值,矩阵与标量的相乘,矩阵乘法,矩阵求逆,稀疏矩阵的实现,6,能否结合,VC,和,Matlab,的优点?,VC,和,Matlab,混合编程!,7,VC和Matlab的混合编程,有多种方法可以进行VC和Matlab的混合编程:,VC调用Matlab引擎,matlab程序编译为dll,c+程序编译为mex,VC调用Matlab c Math Library,VC调用Matlab c+ Math Library,COM,8,在VC中调用Matlab C+ Math Library实现二维矩阵的操作:,编程方便,有数值运算库;速度快,mwArray a,b,c;,a = ones(10,10);,b = randon(10,10);,c = a*b,;,c=inv(c);,c=sparse(c),矩阵变量定义,矩阵初始化,矩阵初始化,矩阵乘法,矩阵求逆,稀疏矩阵的实现,I Matlab C+ Math Library!,9,Step by Step,10,下面考虑将C+的数组转换为Matlab C+ Math Library的mwArray结构,可以方便地利用mwArray结构,建立,顶点相关边长权稀疏矩阵,进行三角网格数据的相关操作,我们还可以不安装Matlab的开发环境,就能使用它的数学库函数,首先看看具体开发工具的设置:,11,1 将Matlabexterninclude下所有的头文件打包为include.rar,解压缩到用户目录/test下,2 将mglinstaller.exe文件复制到用户目录/test下,并运行解压缩出动态库,3 在VC的Tools-Options中将上述的头文件和库文件目录加入到Directory下,4 新建工程,按照下面的图片依次设置,12,13,14,15,16,5 在程序中#include ,现在可以使用,Matlab C+ Math Library,了!,17,int Faces43 = 1,2,3,2,4,3,3,4,6,4,5,6;,double Vertexs63=0,0,0,1,1,0,1,-1,0,2,-0.2,0,3,-0.8,0,2.8,1,0;,18,/ 将网格顶点数据附为mwArray类型变量,mwArray mVertexes = zeros(6,3);,for (i=1;i=6;i+),for (j=1;j=3;j+),mVertexes(i,j) = Vertexsi-1j-1;,/ 将网格顶点数据附为mwArray类型变量,mwArray mFaces = zeros(4,3);,for (i=1;i=4;i+),for (j=1;j=3;j+),mFaces(i,j) = Facesi-1j-1;,19,/ 获得顶点相关边长权稀疏矩阵,mwArray v2v = sparse(zeros(6,6);,for (i=1;i=4;i+),/ 对面遍历,mwArray v1 = mFaces(i,1);,/面上的一个顶点序号,mwArray v2 = mFaces(i,2);,mwArray v3 = mFaces(i,3);,mwArray v1xyz = mVertexes(v1,colon();,/面的三个顶点的三维坐标向量,mwArray v2xyz = mVertexes(v2,colon();,mwArray v3xyz = mVertexes(v3,colon();,v2v(v1,v2) = norm(v1xyz-v2xyz);,/用对应的边长向顶点相关系数矩阵赋值,v2v(v1,v3) = norm(v1xyz-v3xyz);,v2v(v2,v3) = norm(v2xyz-v3xyz);,20,/ 矩阵运算,mwArray mVertexes2 = 2*mVertexes;,/ 矩阵求逆 inv,/ 集合交并补 intersect,/ 排序 sort,/ .,/ 获得mwArray数据的值,for (i=1;i=6;i+),for (j=1;j=3;j+),mwArray vxyz = mVertexes(i,j);,Vertexsi-1j-1 = vxyz.ExtractScalar(1);,21,应用举例,求三角网格表面的近似测地线,切原始网格的边,迭代算法,数据结构复杂,直接用VC实现困难,计算量大,一万顶点网格的顶点邻接矩阵的规模为10,8,直接用Matlab实现算法速度太慢,22,应用举例:,求539点Bunny三角网格表面一条近似测地线,原来需要40s,现需要0.25s,23,应用举例:,求32316点弥勒佛表面一条近似测地线,原来无法计算,现需要12s,24,参考资料:,MATLAB C+ Math Library 2.1 Reference .pdf,MATLAB C+ Math Library 2.1 Users Guide.pdf,25,
展开阅读全文