由于mexFunction与直接在C语言里编程不同,所以指针的运用很繁琐,尤其是面临着参数传入传出的问题。这里,我将matlab中生成的一个三维矩阵传到mexFunction中,然后进行传出到matlab。当然,我们可以根据自己的需要在mexFunction中进行矩阵的各种操作和计算。
一、三维矩阵维度参数的提取
int M,N,K; //定义三个维度的元素个数
cons int *dim_array;
dim_array=mxGetDimensions(prhs[0]);
#include<stdio.h>
#include"mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double *p;
double *page;
// mwSize dims[3];
int i,j,k,M,N,K;
int ii=0;
const int *dim_array;
int numberofdims;
numberofdims=mxGetNumberOfDimensions(prhs[0]);
dim_array=mxGetDimensions(prhs[0]);
p=mxGetPr(prhs[0]);
M=*dim_array;sanwei
N=*(dim_array+1);
K=*(dim_array+2);
printf("%d %d %d \n",M,N,K);
//dims[3]=(M,N,K);
plhs[0]=mxCreateNumericArray(mxGetNumberOfDimensions(prhs[0]),mxGetDimensions(prhs[0]),mxDOUBLE_CLASS,mxREAL);
page=(double*)mxGetData(plhs[0]);
for(k=0;k<K;k++)
{
// *page=*(page+M*N);
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
page[(M*N)*k+i*N+j]=p[(M*N)*k+i*N+j];
}
}
}
}
M=*dim_array;
N=*( dim_array+1);
K=*( dim_array+2);
printf(“%d%d %d \n”,M,N,K);
二、三维矩阵的传递
1、对于matlab常用的双精度矩阵,所以我们用mxCreateNumericArray函数来生成N维的矩阵,mxGetNumberOfDimensions(prhs[0])获取当前矩阵的维度,结果也就是3;mxGetDimensions(prhs[0])是获取矩阵的各个维度值(这一项,同样可以定义int dims[3],然后以前很多方法可以利用dim={M,N,K}我用的matlab2014b和VC2013需要把大括号换成小括号才不会报错,需要注意一下)
plhs[0]=mxCreateNumericArray(mxGetNumberOfDimensions(prhs[0]),mxGetDimensions(prhs[0]),mxDOUBLE_CLASS,mxREAL);
2、获取输出矩阵plhs[0]之后,我们就可以对其进行赋值了,这里我们定义double *page来操作:
page=(double*)mxGetData(plhs[0]);//注意这里mxGetData出来的是void *类型,需要强转。
3、三维矩阵的赋值,利用我们常见的三层循环来做,p是输入指针:
for(k=0;k<K;k++)
{
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
page[(M*N)*k+i*N+j]=p[(M*N)*k+i*N+j];
}
}
}
最近也是刚接触这块,各位有什么好的想法和更方便的思路欢迎一起交流!