mex, matlab中调用C 编程

当程序中需要进行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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值