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