⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 问专家-matlab与c++的接口问题.htm

📁 VC与Matlab混合编程文章.
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<BR>&nbsp;&nbsp;&nbsp;&nbsp;ir指向一个长度为nzmax的整型数阵列,阵列包含的是pr和pi中对应元素的行号。 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;jc指向一个长度为N+1的整型数阵列(N为矩阵的列数),其中包含的是列号信息。对于任意的j,如果0≤j≥N-1,jc[j]是第j列中第一个非零项在ir、pr(以及pi)中的序号,jc[j+1]-1是第j列最后一个非零项的序号。因此jc[N]总等于nnz——矩阵中非零项的总个数。如果nnz小于nzmax,可以继续向矩阵中添加非零项而无需分配额外的存储空间 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;。 <BR>&nbsp;&nbsp;&nbsp;&nbsp;4、主要函数举例: 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;·MATFile *matOpen(const char *filename, const char * 
mode)——打开/创建 <BR>&nbsp;&nbsp;&nbsp;&nbsp;·MATFile *matOpen(const char *filename, 
const char * mode)——打开/创建一个MAT文件; <BR>&nbsp;&nbsp;&nbsp;&nbsp;·int 
matClose(MATFile *pMF)——关闭一个MAT文件; <BR>&nbsp;&nbsp;&nbsp;&nbsp;·mxArray 
*mxCreateDoubleMatrix(int m, int n, mxComplexity flag) 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; ——创建一个(复)双精度矩阵; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;·mxArray *mxCreateSparse(int m, int n, int nzmax, 
mxComplexity flag) <BR>&nbsp;&nbsp;&nbsp;&nbsp; ——创建一个稀疏矩阵; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;·mxArray *matGetNextArray(MATFile 
*pMF)——获得MAT文件里面下一个矩阵; <BR>&nbsp;&nbsp;&nbsp;&nbsp;·const char *mxGetName(const 
mxArray *pa)——获得矩阵pa的名称; <BR>&nbsp;&nbsp;&nbsp;&nbsp;·void mxSetName(mxArray 
*pa,const char *s)——为矩阵pa设置一个名称; <BR>&nbsp;&nbsp;&nbsp;&nbsp;·int mxGetM(const 
mxArray *pa)——获得矩阵pa的总行数; <BR>&nbsp;&nbsp;&nbsp;&nbsp;·int mxGetN(const mxArray 
*pa)——获得矩阵pa的总列数; <BR>&nbsp;&nbsp;&nbsp;&nbsp;·double *mxGetPr(const mxArray 
*pa)——获得矩阵pa的pr指针; <BR>&nbsp;&nbsp;&nbsp;&nbsp;·int *mxGetIr(const mxArray 
*pa)——获得稀疏矩阵pa的ir指针; <BR>&nbsp;&nbsp;&nbsp;&nbsp;·int *mxGetJc(const mxArray 
*pa)——获得稀疏矩阵pa的jc指针; <BR>&nbsp;&nbsp;&nbsp;&nbsp;·int matPutArray(MATFile * pMF, 
const mxArray * pA) <BR>&nbsp;&nbsp;&nbsp;&nbsp; ——把矩阵pA存储入MAT文件pMAF; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;·void mxDestroyArray(mxArray *pa)——释放矩阵pa(把它从内存中撤销); 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;5、两个例子: 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;·获取一个MAT文件中第一个矩阵的信息 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;·获取一个MAT文件中第一个矩阵的信息 <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
typedef struct { <BR>&nbsp;&nbsp;&nbsp;&nbsp; char szFileName[256]; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; MATFile* pMatFile; <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
mxArray* pArray; <BR>&nbsp;&nbsp;&nbsp;&nbsp; char szArrayName[64]; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; char szErrMsg[256]; <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
unsigned int nArrayDim[2]; <BR>&nbsp;&nbsp;&nbsp;&nbsp; bool bIsSparse; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; } MATFileStruct; <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;int GetMATFileStruct(MATFileStruct *pMAThdr) 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
if((pMAThdr-&gt;pMatFile=matOpen(pMAThdr-&gt;szFileName,"r"))==NULL) 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; { strcpy(pMAThdr-&gt;szErrMsg,"Can't open this mat 
file"); <BR>&nbsp;&nbsp;&nbsp;&nbsp; return(0); <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
}/*打开一个MAT文件*/ <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
if((pMAThdr-&gt;pArray=matGetNextArray(pMAThdr-&gt;pMatFile))==NULL) 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; { strcpy(pMAThdr-&gt;szErrMsg,"Can't get arrays"); 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; matClose(pMAThdr-&gt;pMatFile); 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; return(0); <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
}/*获取MAT文件中的第一个矩阵*/ <BR>&nbsp;&nbsp;&nbsp;&nbsp; }/*获取MAT文件中的第一个矩阵*/ 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
pMAThdr-&gt;nArrayDim[0]=mxGetM(pMAThdr-&gt;pArray); /*获取其行数*/ 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
pMAThdr-&gt;nArrayDim[1]=mxGetN(pMAThdr-&gt;pArray); /*获取其列数*/ 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
strcpy(pMAThdr-&gt;szArrayName,mxGetName(pMAThdr-&gt;pArray)); /*获取其名称*/ 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
pMAThdr-&gt;bIsSparse=mxIsSparse(pMAThdr-&gt;pArray); /*判断它是否是系数矩阵*/ 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; mxDestroyArray(pMAThdr-&gt;pArray); /*在内存中撤销这个矩阵*/ 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; matClose(pMAThdr-&gt;pMatFile); /*关闭MAT文件*/ 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; return(1); <BR>&nbsp;&nbsp;&nbsp;&nbsp;} 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;·创建稀疏矩阵并赋值 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; int i,j,k,m,n,nzmax,*ir,*jc; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; double *pr; <BR>&nbsp;&nbsp;&nbsp;&nbsp; unsigned 
short *pData; <BR>&nbsp;&nbsp;&nbsp;&nbsp; mxArray *pa; file://初始化。 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; m=pLCMShdr-&gt;TrueHdr.nArrayDim[0]; 
file://获得原矩阵行数。 <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
n=pLCMShdr-&gt;TrueHdr.nArrayDim[1]; file://获得原矩阵列数。 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; nzmax=0; <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;m*n;i++) <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
{ if(pData[i]!=0) <BR>&nbsp;&nbsp;&nbsp;&nbsp; nzmax++; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; nzmax++; <BR>&nbsp;&nbsp;&nbsp;&nbsp; } 
file://计算数据中非零元个数。 <BR>&nbsp;&nbsp;&nbsp;&nbsp; if(nzmax&lt;n) 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; nzmax=n; <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; pa=mxCreateSparse(m,n,nzmax,mxREAL); 
/*创建一个空的稀疏矩阵pa。*/ <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
mxSetName(pa,pLCMShdr-&gt;TrueHdr.szArrayName); /*为稀疏矩阵pa设置名称。*/ 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; pr=mxGetPr(pa); file://获得pa的pr指针。 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; ir=mxGetIr(pa); file://获得pa的ir指针。 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; jc=mxGetJc(pa); file://获得pa的jc指针。 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; k=0; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; for(j=0;j&lt;n;j++) <BR>&nbsp;&nbsp;&nbsp;&nbsp; { 
jc[j]=k; file://jc[j]:截至到第j列非零元的个数。 <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
for(i=0;i<M;I++) <br>&nbsp;&nbsp;&nbsp;&nbsp; { if(pData[i]!=0) 
file://如果第j列第i行的元素是个非零元。 <BR>&nbsp;&nbsp;&nbsp;&nbsp; { ir[k]=i; 
file://记录下第k个非零元的行号。 <BR>&nbsp;&nbsp;&nbsp;&nbsp; k++; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; } <BR>&nbsp;&nbsp;&nbsp;&nbsp; } 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; pData+=m; file://移动pData指针到下一列。 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; } <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; jc[n]=k; file://jc[n]等于矩阵中非零元的个数。 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; matPutArray(pmat,pa); file://把稀疏矩阵pa存入MAT文件pmat。 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; mxDestroyArray(pa); file://从内存中撤销矩阵pa。 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;(五)引擎应用程序 <BR>&nbsp;&nbsp;&nbsp;&nbsp;1、简介 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;引擎应用程序的实质是把MATLAB做为一个引擎,它允许从你自己的C++程序调用这个引擎。在运行时,引擎作为一个进程单独运行,你的C++程序也作为一个进程单独运行,二者可以通过进程间的通信机制进行交互。 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;2、引擎库 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;MATLAB引擎库包含了若干个控制MATLAB引擎的函数,如下所示: 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; engOpen 启动MATLAB引擎 <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
engClose 关闭MATLAB引擎 <BR>&nbsp;&nbsp;&nbsp;&nbsp; engGetArray 
从MATLAB引擎中获取一个MATLAB矩阵 <BR>&nbsp;&nbsp;&nbsp;&nbsp; engPutArray 
向MATLAB引擎发送一个MATLAB矩阵 <BR>&nbsp;&nbsp;&nbsp;&nbsp; engEvalString 执行于一个MATLAB命令 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; engOutputBuffer 创建一个存储MATLAB文本输出的缓冲区 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; 同时,引擎应用程序还可以使用前面提到的API函数。 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;3、一个例子 <BR>&nbsp;&nbsp;&nbsp;&nbsp; 
从这个示例中,我们看出引擎应用程序是如何编制的: <BR>&nbsp;&nbsp;&nbsp;&nbsp;/* $Revision: 1.3 $ */ 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;/* <BR>&nbsp;&nbsp;&nbsp;&nbsp;* engdemo.c 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;* <BR>&nbsp;&nbsp;&nbsp;&nbsp;* This is a simple 
program that illustrates how to call the <BR>&nbsp;&nbsp;&nbsp;&nbsp;* MATLAB 
engine functions from a C program. <BR>&nbsp;&nbsp;&nbsp;&nbsp;* 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;* Copyright (c) 1996-1998 The MathWorks, Inc. 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;* All rights reserved <BR>&nbsp;&nbsp;&nbsp;&nbsp;*/ 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;#include 
<STDLIB.H><BR>&nbsp;&nbsp;&nbsp;&nbsp;#include 
<STDIO.H><BR>&nbsp;&nbsp;&nbsp;&nbsp;#include 
<STRING.H><BR>&nbsp;&nbsp;&nbsp;&nbsp;#include "engine.h" 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;#define BUFSIZE 256 <BR>&nbsp;&nbsp;&nbsp;&nbsp;int 
main() <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;Engine *ep; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;mxArray *T = NULL, *result = NULL; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;char buffer[BUFSIZE]; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;double time[10] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 
6.0, 7.0, <BR>&nbsp;&nbsp;&nbsp;&nbsp;8.0, 9.0 }; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;8.0, 9.0 }; <BR>&nbsp;&nbsp;&nbsp;&nbsp;6-6 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;/* <BR>&nbsp;&nbsp;&nbsp;&nbsp;* Start the MATLAB 
engine locally by executing the string <BR>&nbsp;&nbsp;&nbsp;&nbsp;* "matlab". 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;* <BR>&nbsp;&nbsp;&nbsp;&nbsp;* To start the session 
on a remote host, use the name of <BR>&nbsp;&nbsp;&nbsp;&nbsp;* the host as the 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -