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)
包含三种格式:string
、matrix
、double
产生上述数据的代码如下(在运行下面代码之前需要先在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如下: