Linux下C和matlab混合编程

0.前提是需要安装好了matlab
1.编译m文件为可执行文件mex -setup设置好了c编译器之后。

写个简单函数test.m

function test

x=0:0.01:2*pi;

y=sin(x);

plot(x,y)

保存.

编译,在matlab命令行中执行 mcc -m test.m

就会生成可执行的文件test和一个脚本run_test.h

./run_test.h /bin

 

2.C中调用matlab计算引擎(绘图等)

步骤:

(1)安装csh;

sudo apt-get install csh

(2)设置:动态库路径LD_LIBRARY_PATH中添加/bin/

         PATH路径中添加/bin

(3)编译:gcc test.c -o test -I $HOME/MATLAB/R2011b/extern/include -L $HOME/MATLAB/R2011b/bin/glnx86/ -leng -lmx -lmex

 (注意cpu是x86还是a64)

(4)运行:./test

(参考:http://hi.baidu.com/36470902/blog/item/c323a5b14d3c175c08230250.html)

 

其中第(2)步设置,在~/.bashrc中添加,注意由于这里是添加在当前用户下的,需要用sudo chmod -R 0777 ~/.matlab/* 更改权限,否则会执行错误

MATLAB="Matlab_Installed_Directory" (比如说我的安在了$HOME/MATLAB/R2011b下面,所以应该写全到2011b)

export PATH=~/Program:$MATLAB/bin:$PATH

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MATLAB/bin/glnx86 #这里注意cpu是x86还是a64

export C_INCLUDE_PATH=$C_INCLUDE_PAT:$MATLAB/extern/include

export LIBRARY_PATH=$LIBRARY_PATH:$MATLAB/bin/glnx86

(前面两行是一个是可执行文件搜索路径,一个是动态库搜索路径,后面两个是gcc编译时的include头文件搜索路径和动态库搜索路径)

这样第三步编译就可以简单的写为:

gcc test.c -o test -leng -lmx -lmex -lm

gcc -v 4.9

 

源文件test.c如下:

 

#include

#include

#include

#include

#include "engine.h"

 

#define N 500

 

main()

{

int i;

double x[N],y[N];

Engine *ep;

 

for(i=0;i

x[i]=0.01*i;

y[i]=sin(x[i]);

}

 

//启动matlab计算引擎,异常处理

if(!(ep=engOpen(NULL))){

printf("Can't start Matlab engine!");

exit(1);

}

 

//定义mxArray

mxArray *xx=mxCreateDoubleMatrix(1,N,mxREAL);

mxArray *yy=mxCreateDoubleMatrix(1,N,mxREAL);

 

//将数组复制到mxArray

memcpy(mxGetPr(xx),x,N*sizeof(double));

memcpy(mxGetPr(yy),y,N*sizeof(double));

 

//将mxArray数组写入到Matlab工作空间,并命名

engPutVariable(ep,"xx",xx);

engPutVariable(ep,"yy",yy);

 

//向Matlab引擎发送画图命令

engEvalString(ep,"plot(xx,yy);");

 

printf("Press 'Enter' to exit!");

getchar();

 

//销毁mxArray数组

mxDestroyArray(xx);

mxDestroyArray(yy);

 

//关闭matlab引擎

engClose(ep);

 

}

 

有图为证:

Linux下C和matlab混合编程_第1张图片

 

 

 

 

昨天刚全新在虚拟机上安装了Ubuntu 14.04,在其中安装的gcc版本是4.8.4。而我需要编译C++程序,在安装之后,我立刻就通过命令:

sudo apt-get install build-essential
  •  

安装了make、g++等。build-essentail是一整套开发工具。安装后,可以使用命令 g++ –version查看安装是否成功。

诚然,g++4.8.4能帮助我解决好的问题,但是我正在学习C++11的新特性,毕竟g++4.9.2对C++11的支持更加完善一些,所以我决定升级g++版本。又因为gcc是一整套编译工具的组合,g++是其中的一部分,所以,既然决定升级了,就顺带把整个gcc都更新。

下面讲解将Ubuntu14.04中的gcc/g++升级到版本4.9.2的方法。

1 安装4.9版本的gcc/g++

在Terminal中输入下面的命令,在加上几分钟的等待,即可完成安装:

 
  1. $ sudo add-apt-repository ppa:ubuntu-toolchain-r/test

  2. $ sudo apt-get update

  3. $ sudo apt-get install gcc-4.9 g++-4.9

安装完成后,你会发现如果直接使用gcc/g++命令,默认采用的版本仍然是原来的4.8.4版本。你如果要使用新版的gcc/g++,必须采用命令gcc-4.9/g++-4.9。下面讲解如何将版本4.9设为默认。

2 将版本为4.9的gcc/g++设置为默认

采用以下命令:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.9
  • 就可将gcc/g++的默认版本设为4.9.2。update-alternatives是一个管理工具,能够管理同一个软件的不同版本。上命令中,参数slave保证gcc和g++版本的联动调整。而60是表示的优先级,你可以选用任何你喜欢的大于0的整数。那么,此时你再利用gcc命令查看当前的版本,就会发现已经是新版本了,如下图: 

这里写图片描述
但是,接下来的一个问题是,如果你还想继续使用原来的版本,怎么办?况且原来版本并没有删除。同样还是利用update-alternatives,及如下的命令:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8
  •  

上面的优先级设为50,所有当前默认为4.9.2版本。你可以使用命令

sudo update-alternatives --query gcc
  •  

来查看被update-alternatives管理的gcc不同版本,这同样可以针对g++。

既然gcc/g++的不同版本已被update-alternatives管理,那么如何在这两个不同的gcc/g++版本间进行切换使用呢?

3 gcc/g++不同版本的切换使用

采用如下图所示的命令,接着再输入对应的序号,就可以在不同的版本间进行切换: 
这里写图片描述

 

你可能感兴趣的:(Matlab)