当程序中需要进行N次(N很大)循环时,使用matlab较慢,考虑使用C++处理该循环。
下面的部分内容转自 http://blog.sciencenet.cn/blog-620659-579885.html
简单示例:
把下面的程序存为hello.c。
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
mexPrintf("hello,world!\n");
}
在matlab命令行: mex hello.c
执行命令: hello
接口函数规范mexFunction介绍
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
nlhs:输出参数数目
plhs:指向输出参数的指针
nrhs:输入参数数目
prhs: 指向输入参数的指针
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double *data;
int M,N;
int i,j;
data=mxGetPr(prhs[0]); //获得指向矩阵的指针
M=mxGetM(prhs[0]); //获得矩阵的行数
N=mxGetN(prhs[0]); //获得矩阵的列数
for(i=0;i<M;i++)
{ for(j=0;j<N;j++)
mexPrintf("%4.3f ",data[j*M+i]);
mexPrintf("\n");
}
}
% 将输入数据传到输出数据的方法。
for(i=0;i<M;i++)
for(j=0;j<N;j++)
outData[j*M+i]=inData[j*M+i]; // inData是一维数组表示的? outData也是一维数组吗?
% matlab中 M * N 的矩阵, 传到mex文件后,仍为M*N 的矩阵,但是被存成一维矩阵,其存储顺序仍然是 matlab中的顺序,按矩阵的列进行存储的。(一列一列存储)
%%%% 当使用多个.cpp文件时,可参考如下链接
http://bbs.sjtu.edu.cn/bbscon,board,MathTools,file,M.1287373584.A.html
% 以下是一些个人观点:
% mex 似乎是针对标准C的,
% 在mex 文件中声明变长数组时,一般只能使用malloc, free; 而不能使用new, delete 。下面是一个一维变长数组的声明示例:
% 在mex中:
% double *data ;
% data =(double*)malloc( N*sizeof(double));
...
% free(data) ;
%%%%注意
%对mex函数,是通过指针变量将数据传入函数的,故在mex函数中,可能对输入数据改变,从而造成原始输入数据的改变; 这是非常值得注意的。
% 虽然mex函数的输入为 const 类型 *prhs , 但是在mex函数中可以改变prhs指针指向的内容,从而造成主程序中该输入变量值的改变,影响程序运行
% 在需要改变输入变量值的情况下,应在mex函数内 申请内存,声明新的变量 来代替输入变量,再对声明的新变量,改变其值。
%对返回的变量也需要在mex内声明
矩阵的左右翻转
im = fliplr( im ) ;
% 在linux上运行mex文件时,其源码内的字符出现"//" 可能会报错,故应将所有注释去掉
%
在linux, 可能不知道max函数,若知道明确的值是浮点数允许我使用fmin和fmax min和max在C代码编译、链接和运行成功。
% 即尝试使用fmax
可参考http://sleefd.github.io/blog/2012/12/28/mex/