MATLAB-C++混合编程(c++读取matlab中matrix,struct,cell格式数据)

1.matlab-c++混合编程常用API

https://zlearning.netlify.com/communication/matlab/matlabcmexapi

2.c++读取matrix类型数据

利用matlab产生一个5*3矩阵,利用c++读取其中位置为(row,col)的值,同时c++向matlab传递一个新矩阵。生成的随机矩阵如下:
在这里插入图片描述
产生上述数据的代码如下(在运行下面代码之前需要先在matlab控制台运行mex readMatrix.cpp

clc;clear all;
A=rand(5,3);
row=4;col=2;
ans=readMatrix(A,row,col);

利用c++读取matlab中matrix格式的数据
参数解析:
prhs[]:从MATLAB传入C++的参数,如果有多个参数,则分别为prhs[0],prhs[1],…
mxGetPr():将mxArray *类型数据转化为double *类型
mxGetM():获取当前矩阵的行数
mxGetN():获取当前矩阵的列数
plhs[]:由C++传出MATLAB的数据,如果有多个参数则分别为plhs[0],plhs[1],…

//函数名:readMatrix.cpp
#include "mex.h"
#include<cstdio>
//read matrix from matlab
void mexFunction(int nlhs,mxArray* plhs[],int nrhs,mxArray* prhs[]){
	double *input=mxGetPr(prhs[0]);//传入的第一个参数 
	size_t m=mxGetM(prhs[0]); 
	size_t n=mxGetN(prhs[0]);
	printf("the row of matrix is %d\n",m);
	printf("the column of matrix is %d\n",n);
	
	size_t row=mxGetScalar(prhs[1]);
	size_t col=mxGetScalar(prhs[2]);
	
	printf("the data of row %d column %d is:%f\n",row,col,*(input+(col-1)*m+row-1));
	
	//store a matrix data 
	plhs[0] = mxCreateDoubleMatrix( (mwSize)m, (mwSize)n, mxREAL);
	double *c=mxGetPr(plhs[0]);
	c[0]=5;
	c[1]=6;
	c[10]=33;
}
matrix读取结果如下:

在这里插入图片描述

同时利用c++新生成矩阵如下:

在这里插入图片描述

3.c++读取struct类型数据

利用MATLAB产生struct类型的数据,数据名stu, stu(i)包含三种格式:
stringmatrixdouble
在这里插入图片描述
产生上述数据的代码如下(在运行下面代码之前需要先在matlab控制台运行mex readStruct.cpp

clc;clear all;close all;
stu(1).name='aa';
stu(2).name='bb';
stu(3).name='cc';
for i=1:3
	stu(i).list=rand(5,4);
	stu(i).id=randi(100);
end
readStruct(stu);

利用c++读取matlab中struct格式的数据

//c++函数名:readStruct.cpp
#include "mex.h"
#include<cstdio>
//read struct from matlab
void mexFunction(int nlhs,mxArray* plhs[],int nrhs,mxArray* prhs[]){
	size_t m,n;
	if(mxIsStruct(prhs[0])){
		m=mxGetM(prhs[0]);//row 
		n=mxGetN(prhs[0]);//column
		size_t numStruct =m*n;
		printf("the total number of struct is %d\n",numStruct);
		for(size_t i=0;i<numStruct;i++){
			printf("===the info of the %d student====\n",i+1);
			//read scalar
			mxArray	*ID=mxGetField(prhs[0],i,"id");//mxArray *
			if(ID){
				double id=mxGetScalar(ID);
				printf("id=%f\n",id);
			}
			
			//read matrix
			printf("matrix=\n");
			mxArray *tmpMatrix=mxGetField(prhs[0],i,"list");
			if(tmpMatrix){
				double *tmpmatrix=mxGetPr(tmpMatrix);//double *
				m=mxGetM(tmpMatrix);//row
				n=mxGetN(tmpMatrix);//column
				for(size_t i=0;i<m;i++){
					for(size_t j=0;j<n;j++){
						printf("%f ",*(tmpmatrix+j*m+i));
					}
					printf("\n");
				}
			}
			
			//read string
			mxArray *tmpString=mxGetField(prhs[0],i,"name");
			if(tmpString){
				char * tmp=mxArrayToString(tmpString);//convert mxArray to string
				if(tmp)
					printf("name=%s\n",tmp);
			}
		}
	}
}
struct读取结果如下:

在这里插入图片描述

4.c++读取cell类型数据

matlab产生简单的cell数据,在运行matlab程序前先在matlab控制台运行mex readCell.cpp

//MATLAB程序
clc;close all;close all;
person=cell(3,2);//产生一个3*2的cell
for i=1:3
	for j=1:2
		person{i,j}=rand(3,2);//每个cell填充一个任意大小的矩阵
	end
end
ans=readCell(person);

生成cell数据如下:
在这里插入图片描述
利用C++读取matlab cell类型数据,同时利用C++给MATLAB传送一个Hello的Cell数据。

//函数名:readCell.cpp
#include"mex.h"
#include<cstdio>
void mexFunction(int nlhs,mxArray* plhs[],int nrhs,mxArray* prhs[]) {
	//read cell
	size_t m,n;
	if(mxIsCell(prhs[0])) {//判断MATLAB传入的参数是不是cell类型
		size_t numCell=mxGetNumberOfElements(prhs[0]);//求出所有的cell数量
		printf("numcell=%d\n",numCell);
		for(size_t i=0; i<numCell; i++) {
			printf("=====the info of cell %d ====\n",i+1);
			mxArray *mxarray=mxGetCell(prhs[0],i);//the info of cell i
			m=mxGetM(mxarray);//rows
			n=mxGetN(mxarray);//columns

			printf("m=%d n=%d\n",m,n);
			double *input=mxGetPr(mxarray);//double *,每一个cell的具体内容
			
			for(size_t i=0; i<m; i++) {
				for(size_t j=0; j<n; j++) {
					printf("%f ",*(input+j*m+i));
				}
				printf("\n");
			}
		}
	}
	//store 2-dim cell,dim=(5,1)
	mxArray* newCell=mxCreateCellMatrix(5,1);//row:m,column:n,matArray*
	size_t numOutCell=mxGetNumberOfElements(newCell);

	//fill cell with string
	mxArray *str = mxCreateString("Hello");
	mxSetCell(newCell, 0, mxDuplicateArray(str));
	mxDestroyArray(str);
	//store cell
	plhs[0]=newCell;

}
读取cell类型数据如下:

在这里插入图片描述
新生成Hello的cell如下:
在这里插入图片描述

posted @ 2019-04-16 20:23  xzhws  阅读(669)  评论(0编辑  收藏  举报