精华内容
下载资源
问答
  • 2021-04-29 10:14:30

    命令行调用matlab -nodesktop -nosplash -r "codename"

    此命令linux下调用matlab程序的命令,因此可以使用 C 语言的系统调用函数system()或者exec()来进行调用对于matlab软件的安装,如果没有root权限,安装程序需要使用编译安装的方式进行软件的安装;

    利用MCR (Matlab Compiler Runtime)来编写可移植的C语言调用matlab的程序这种方法只需要使用者安装MCR包实现matlab软件想要的功能,可以实现matlab程序在其他未安装的matlab软件上的运行下载地址: https://www.mathworks.com/products/compiler/matlab-runtime.html

    此处介绍一下通用的软件安装方式 ------ 编译安装解压:unzip MCR_R2016a_glnxa64_installer.zip

    编译:./install -mode silent -agreeToLicense yes -destinationFolder -agreeToLicense yes这个选项必须有,其他的则根据自己的环境进行选择 (–help可以查看有哪些可用选项)安装: make && make install

    运行示例首先按照matlab程序的编写方式编写了matlab程序: init.m

    Linux 平台使用MCR编译该程序: mcc -mv init.m经过mcc编译之后会产生两个运行文件 init和run_init.sh,这两个程序都可以运行init.m的功能运行: ./run_init.sh /home/tools/matlab/mcr_2017b/v93

    更多相关内容
  • C 语言调用matlab生成的DLL文件
  • C语言调用matlab引擎

    2016-10-22 16:50:22
    利用C语言调用matlab引擎。
  • 提供了C语言调用matlab命令的过程,可作为模版来使用;注意需要先安装matlab才可正确运行。
  • C语言调用MATLAB程序之简单样例

    万次阅读 2016-10-09 21:44:50
    首先声明一下,本文中C语言调用MATLAB语言的方法,本质上是通过C语言编程实现利用MATLAB引擎执行MATLAB代码,并最终获得执行结果。如何用C语言创建MATLAB引擎的引用,MATLAB已经为我们准备好了一系列的头文件以及...

        首先声明一下,本文中C语言调用MATLAB语言的方法,本质上是通过C语言编程实现利用MATLAB引擎执行MATLAB代码,并最终获得执行结果。如何用C语言创建MATLAB引擎的引用,MATLAB已经为我们准备好了一系列的头文件以及动态链接库文件,所以我们只要配置好相关环境即可(如何配置环境可以参考我上一篇博客)。从另一方面讲,这也就意味着程序执行时需要完整的MATLAB软件的支持,当然还有一种调用方案是将“.m文件”编译成dll,但程序运行时仍需要MCR的支持。
        因为我们要调用MATLAB程序,所以我们要先编写MATLAB代码。我将MATLAB代码文件保存在默认位置(也就是我们保存时软件给出的位置,我的软件版本是R2014b)上,在我的电脑上的路径是“文档\MATLAB”。这样做的好处是我们不需要做额外的设定,这些代码就能在我们调用它们时执行,如果你保存到其他位置,那么就要调用一个函数来设定工作空间,这个函数你可以在下面的参考博文[1]中找到。
        在准备好MATLAB程序后,我们就开始建立C语言工程,我这里使用的集成开发环境是VS2015(建议选择VS系列,其他开发环境不一定能进行相关引用的配置)。建好工程后,我们就要配置好工程的环境,这个可以参考我上一篇博文。配置好工程环境后,我们就可以编写代码,这里我给出一个简单的示例代码,大家看过之后就会明白使用方法。

    #include <stdio.h>
    #include <math.h>
    #include "engine.h" //添加MATLAB引擎头文件
    #include <string.h>
    
    int main()
    {   
        double m[][3] = { {1, 2, -4}, {-2, 2, 1}, {-3, 4, -2} };
    
        Engine *ep; 
        mxArray *matrix, *r_matrix, *value;
    
        if (!(ep = engOpen(NULL)))
        {
            fprintf(stderr, "\n无法启动MATLAB引擎\n");
            return EXIT_FAILURE;
        }
    
        matrix = mxCreateDoubleMatrix(3, 3, mxREAL);
        memcpy(mxGetPr(matrix), m, sizeof(double)*3*3); 
        engPutVariable(ep, "matrix", matrix);
        //determinant_value是我的MATLAB文件名同时也是文件里的函数名,下同
        engEvalString(ep, "value = determinant_value(matrix)");     
        value = engGetVariable(ep, "value");
        printf("value = %f\n", *mxGetPr(value));
    
        engEvalString(ep, "r_matrix = inverse_matrix(matrix)");
        r_matrix = engGetVariable(ep, "r_matrix");  //r_matrix代表C里的二维数组
        for (int i = 0; i < 3; ++i)
        {
            for (int j = 0; j < 3; ++j)
            {
                printf("%f ", mxGetPr(r_matrix)[i*3+j]);
            }
            printf("\n");
        }
    
        mxDestroyArray(matrix); 
        engClose(ep);
    
        system("pause");
        return 0;
    }
    

        从上面的使用方式我们可以看出, 如果只是直接使用MATLAB自带的函数,则不必单独去写一个MATLAB代码,直接利用engEvalString函数执行即可。


    参考:
    [1] C语言环境中调用Matlab程序指南
    [2] C 语言调用Matlab程序例子

    展开全文
  • 在用C写程序时,有时会遇到数值计算问题,如矩阵的计算、优化问题、解微分方程等等。这些数值计算问题如果自己来实现的话,一来太费时间,二来自己的...在C程序中调用matlab函数即可轻松解决问题。在进行联合编程前...

    在用C写程序时,有时会遇到数值计算问题,如矩阵的计算、优化问题、解微分方程等等。这些数值计算问题如果自己来实现的话,一来太费时间,二来自己的实现方案效率未必高。所以遇到这些数值计算问题时可以先上网搜一下,看看有没有现成的模块(当然要可靠)。另一种解决方法就是依靠matlab了。用过matlab 的人都知道,它提供了丰富的数值计算函数。在C程序中调用matlab函数即可轻松解决问题。

    在进行联合编程前需要经行配置

    1 Visual Studio的配置(VS2008为例)

    选择"工具"→"选项"→"VC++目录",如下图所示添加路径

    0818b9ca8b590ca3270a3433284dd417.png

    0818b9ca8b590ca3270a3433284dd417.png

    2matlab的配置

    在matlab命令行输入mex -setup,按提示选择合适的选项

    在matlab命令行输入mbuild -setup,按提示选择合适的选项

    以上配置只需进行一次就可以了,不必每写一个程序都重复一遍。

    在C中调用matlab有两种方法:1 在C程序中调用matlab引擎 2 matlab函数编译生成dll文件供C程序使用。以下分别介绍

    1在C程序中调用matlab引擎

    为了调用matlab引擎,首先需要引入相应的头文件

    #include "engine.h"

    然后需要加如下几行代码,这样顺利地完成连接。

    #pragma comment( lib, "libeng.lib" )

    #pragma comment( lib, "libmx.lib" )

    #pragma comment( lib, "libmat.lib" )

    有时候你可程序所调用的函数可能还需要其他的库。如果有链接错误提示的话,上网搜一下,然后按上述格式把需要的库加上就可以了。

    接下来就可以在需要的地方调用matlab引擎了。使用时首先需要打开引擎:

    Engine *ep;

    if(!(ep =engOpen("\0")))

    {

    fprintf(stderr,"\nCan't start MATLAB engine\n");

    returnEXIT_FAILURE;

    }

    接下来将C程序中相关的变量变为matlab需要的格式,一般使用mxCreateDoubleMatrix 和 memcpy函数。

    完成转换后使用engPutVariable将数据送到matlab引擎。

    最后调用engEvalString,将matlab命令作为其参数,就可以利用matlab引擎进行计算了。

    计算完成后不要忘了清理工作: 使用mxDestroyArray清除mxCreateDoubleMatrix产生的变量,最后使用engClose关闭引擎。

    下面是一个例子,绘制y=sin(t)的图像

    代码:

    #include

    #include

    #include

    #include "engine.h"

    #pragma comment( lib, "libeng.lib" )

    #pragma comment( lib, "libmx.lib" )

    #pragma comment( lib, "libmat.lib" )

    intmain()

    {

    Engine *ep;

    if(!(ep =engOpen("\0")))

    {

    fprintf(stderr,"\nCan't start MATLAB engine\n");

    returnEXIT_FAILURE;

    }

    intNsample =50;

    constdoublePI =3.1415926;

    double*t =newdouble[Nsample];

    for(inti =0;i 

    {

    t[i]=i *2*PI /Nsample;

    }

    mxArray *T =NULL,*result =NULL;

    T =mxCreateDoubleMatrix(1,Nsample,mxREAL);

    memcpy((void*)mxGetPr(T),(void*)t,Nsample*sizeof(t[0]));

    engPutVariable(ep,"T",T);

    engEvalString(ep,"Y=sin(T);");

    engEvalString(ep,"plot(T,Y);");

    engEvalString(ep,"title('y=sin(t)');");

    engEvalString(ep,"xlabel('t');");

    engEvalString(ep,"ylabel('y');");

    printf("Hit return to continue\n\n");

    fgetc(stdin);

    mxDestroyArray(T);

    engEvalString(ep,"close;");

    engClose(ep);

    returnEXIT_SUCCESS;

    }

    执行结果

    0818b9ca8b590ca3270a3433284dd417.png

    2 C程序调用matlab生成的dll

    如果需要matlab完成的功能比较通用,如果用上述方法,则会产生大量的重复代码。这里要讲的方法将对matlab 的调用做成一个模块,这样每次使用时只需调用这个模块就可以了。

    首先将需要matlab完成的功能做成一个matlab函数,然后利用mcc命令编译,得到h、dll、lib等文件,在C工程中只需加入上述文件即可。下面是一个例子。

    在做通信仿真时通常是给地一组信噪比,然后通过仿真得到在每个信噪比下的误码率,最后绘制出误码率对信噪比的曲线。

    以前的做法是用C仿真,并将结果存在txt文件中,最后让matlab从txt文件中读取数据并绘图。

    利用这里的方法,可以写一个matlab绘图的模块,并在C程序的最后调用,这样就能自动完成绘图了。

    Matlab代码

    functionshowBER(SNR_indB,BER)

    semilogy(SNR_indB,BER,'-o','linewidth',2);

    gridon

    xlabel('E_b/N_0(dB)');

    ylabel('BER');

    在matlab命令行中输入

    mcc -B csharedlib:showBER showBER.m

    得到一组文件

    0818b9ca8b590ca3270a3433284dd417.png

    将其中的.dll .h .lib文件拷贝到C工程中。

    在需要调用绘图模块的cpp文件中加入如下代码

    #include "showBER.h"

    #pragma comment( lib, "libeng.lib" )

    #pragma comment( lib, "libmx.lib" )

    #pragma comment( lib, "libmat.lib" )

    #pragma comment( lib, "mclmcrrt.lib" )

    #pragma comment( lib, "showBER.lib" )

    下面的一段代码显示了调用绘图模块的方法:

    doubleSNR[]={0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5};

    doubleBER[]={9.728816e-002,8.099609e-002,5.633803e-002,3.733608e-002,1.253970e-002,3.936489e-003,1.206820e-003,2.104052e-004,3.109879e-005,3.365857e-006,2.565067e-007};

    intlen =sizeof(SNR)/sizeof(SNR[0]);

    showBERInitialize();

    mxArray*xSNR =mxCreateDoubleMatrix(1,len,mxREAL);

    memcpy(mxGetPr(xSNR),(void*)SNR,sizeof(SNR));

    mxArray*xBER =mxCreateDoubleMatrix(1,len,mxREAL);

    memcpy(mxGetPr(xBER),(void*)BER,sizeof(BER));

    mlfShowBER(xSNR,xBER);

    system("PAUSE");

    showBERTerminate();

    1在调用绘图模块之前需要调用showBERInitialize

    2在调用绘图模块之后需要调用showBERTerminate

    3使用mxCreateDoubleMatrix 和 memcpy 函数将C程序中的变量送入matlab中

    4通过mlfShowBER调用matlab模块。而mlf***函数的调用格式需要参考***.h(此例为showBER.h)文件中的声明。

    运行结果为

    0818b9ca8b590ca3270a3433284dd417.png

    展开全文
  • 利用C语言调用matlab引擎的经历配置环境包含目录的路径配置静态数据库的目录配置附加依赖项的添加系统环境变量的配置遗传算法产生随机数的实现 配置环境 在旁听完一节数学实验课后,对matlab上利用遗传算法编写的...

    配置环境

    在旁听完一节数学实验课后,对matlab上利用遗传算法编写的产生随机数的代码感到了兴趣,这也使我感受到了matlab丰富且强大的函数功能。但随之而来的也是好奇——能否实现在C语言环境下编写出这一套利用遗传算法产生随机数的程序呢?
    于是本人上网搜集了相关资料,很遗憾地发现matlab函数库是属于不被公开的商业机密。但是matlab公司却提供了相关引擎接口,来对接C语言,所以理论上可以通过C语言调用matlab的引擎来执行matlab中的算法。
    本人在网上搜集到的调用matlab引擎的方法有二:

    1. 一是程序运行需要完整的matlab软件进行支持;
    2. 二是可以将matlab中的.m文件编译为.dll文件,运行时只需MCR即可。(MATLAB Component Runtime 简称 MCR,主要用于把MATLAB编写的东西打包到没装MATLAB的机器上使用。它是一组独立的共享库,通过它能够执行在MATLAB中编写的M文件。MCR支持MATLAB语言的所有功能。)

    现暂时尝试第一种方法。而调用引擎的第一步便是要配置好环境。

    包含目录的路径配置

    本人使用C语言编译环境为VS2019,所以首先是需要将VS的环境配置好。所以便打开要调用matlab的C语言工程文件,点开它的属性,找到“配置属性”中的“VC++目录”,将matlab中的相关文件路径添加进去。本人在matlab目录下找到相关文件:
    Matlab目录下的文件夹
    在extern文件夹中:
    include文件夹
    有一个让学C的人感到亲切而又熟悉的include文件夹。
    在这里插入图片描述
    点开它,我们发现里面是浩瀚的.h文件海洋。
    在这里插入图片描述
    于是我们便把这个include文件夹路径添加到VS编译器的“包含目录”中。此处“包含”指那个include目录。这里要注意系统位数,matlab与VS文件的操作位数一定要对应。本人所用电脑为64位,安装的matlab亦为64位。

    静态数据库的目录配置

    在这里插入图片描述
    库目录的路径添加如出一辙,所添加文件夹为include文件夹下方lib文件夹中,win64中的Microsoft文件夹,里面全是.lib文件。

    附加依赖项的添加

    在这里插入图片描述
    然后再在链接器中的输入里,在附加依赖项中加 “libeng.lib;libmat.lib;libmex.lib;libmx.lib;”以便编译器引用所添加的.lib后缀文件们。

    系统环境变量的配置

    但这还不算完,我们最后还需要到Windows中的“高级系统设置”中找到“环境变量”来设置“系统变量”中的“Path”。
    环境变量是个什么东西呢?让我们运行Win+R,在其中输入环境变量path中有的一个文件目录“system32”,会发现系统自动打开了该文件夹;而输入环境变量中没有路径的文件夹名,但系统中存在该文件夹,却不能够打开成功。所以环境变量相当于是告诉系统当用户给的指令不清楚时到里面去找路径,如果有对应的便可以快速打开。
    在这里插入图片描述
    将电脑上matlab的bin,win64文件夹添加进去。
    在这里插入图片描述
    理论上配置环境就完成了。

    在测试的时候出现了一个小插曲,那便是本人在执行完以上步骤后发现C中还是无法打开”engine.h”文件。但最后解决了,问题出在VS配置管理器中“活动解决方案平台”用的还是x86位的,将其设置为x64位后报错即可消除。

    遗传算法产生随机数的实现

    下面是本人写的代码:

    //一个在给定区间[a, b]内产生随机数的程序
    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include"engine.h"
    #define Percise 0.001
    #define LBOUND 200
    #define UBOUND 500
    
    int main(void)
    {
    	puts("Loading...\n");
    	engine* ep;
    	if (!(ep = engOpen(NULL)))
    	{
    		fprintf(stderr, "\n无法启动MATLAB引擎\n");
    		return EXIT_FAILURE;
    	}                                   //判断引擎是否启动成功
    	double L[] = { LBOUND };
    	double U[] = { UBOUND };
    	mxArray*Low,*Up,* Num,*Realnum;
    
    	int range = UBOUND - LBOUND;
    	double number[] = { range/Percise };              //将拥有该精度时区间内数字的个数赋给number数组,number=3
    	Num = mxCreateDoubleMatrix(1, 1, mxREAL);       //初始化了一个mxArray,该数组为1x1的double实数类型
    	Low= mxCreateDoubleMatrix(1, 1, mxREAL);
    	Up= mxCreateDoubleMatrix(1, 1, mxREAL);
    	Realnum = mxCreateDoubleMatrix(1, 1, mxREAL);
    	memcpy(mxGetPr(Low), L, sizeof(L));
    	memcpy(mxGetPr(Up), U, sizeof(U));
    	memcpy(mxGetPr(Num), number, sizeof(number));   //将number数组中的元素拷贝至matlab格式数组mxArray中,现在已有一个mxArray形式的数组了,它叫Num,储存着个数,但现在它还未被写入matlab引擎
    	engPutVariable(ep, "Num", Num);                 //将mxArray格式的数组Num输入matlab引擎    
    	engPutVariable(ep, "Low", Low);
    	engPutVariable(ep, "Up", Up);
    	engEvalString(ep, "Kbits=fix(log(Num)/log(2))");//让matlab计算Kbits
    	engEvalString(ep, "Vmax=2^Kbits");              //给matlab输入命令字符串,让其执行
    	engEvalString(ep, "rndbin=fix(2*rand(1,Kbits))");
    	engEvalString(ep, "rndbin2dec=bin2dec(num2str(rndbin,'%d'))");
    	engEvalString(ep, "r=rndbin2dec/Vmax");
    	engEvalString(ep, "Realnum=Low+(Up-Low)*r");
    
    	if (Realnum= engGetVariable(ep, "Realnum")) //获取在matlab中计算的变量Vmax的值,因为在获取前Vmax在此只是一个空的储存空间
    	{
    		printf("It can be predicted that matlab has processed our order correctly!\n");   //这里准备获取答案
    		Num=engGetVariable(ep, "Num");
    		printf("Num= %f\n\n", *mxGetPr(Num));//为什么Num没有用获得函数“engGetVariabe”便可得到呢?因为Num的赋值是在此利用memcpy写入的
    		printf("The random number is: %f\n ", *mxGetPr(Realnum));
    	}
    	else
    		printf("Too bad!");
    	mxDestroyArray(Low);
    	mxDestroyArray(Up);
    	mxDestroyArray(Num);
    	mxDestroyArray(Realnum);
    	engClose(ep);
    
    	system("pause");
    	return 0;
    }
    

    具体的engine函数可以通过自行查看engine.h文件得知。
    有一点需要注意的是,从C传递给matlab中的数据类型都是mxArray格式的数组矩阵,这里需要注意,通常赋值的办法便是利用memcpy函数将具体数值拷贝至该数组中。
    利用engine函数很方便的一点便是,任何指令都可以通过engEvalString函数以字符串的形式传递给matlab让它直接执行,且算法的中间不需要提前在C中声明并传递给matlab,这也很好地保留了matlab语言简洁易用的特性。

    展开全文
  • VS里用C调用Matlab流程

    2021-09-22 18:29:11
    VS里用C调用Matlab流程导言环境搭建调用步骤详细C调用matlab的interp1()注意 导言  C调用matlab的方法有好几种,本文采用的是最直接粗暴的方法进行调用,大体上调用的思想是:引入#include "engine.h"这个头文件,...
  • C语言调用matlab文件的方法

    千次阅读 2014-12-02 18:35:53
    本文只介绍C和C++调用matlab的不同之处,具体的步骤请参考: ...C语言调用matlab的步骤 1、mcc -W lib:plotsintest-T link:lib sumandmultiply.m -C plotsintest是生成的lib文件的名称,sumandmulti
  • c语言调用matlab程序.pdf
  • C程序中调用Matlab函数的主要过程是:1、调用engOpen函数打开一个Matlab工程2、生成变量矩阵3、调用engPutArray函数将矩阵放入到Matlab工作区间中4、调用engEvalString函数向Matlab传递命令。注意:在VC中,所有和...
  • 首先声明一下,本文中C语言调用MATLAB语言的方法,本质上是通过C语言编程实现利用MATLAB引擎执行MATLAB代码,并最终获得执行结果。如何用C语言创建MATLAB引擎的引用,MATLAB已经为我们准备好了一系列的头文件以及...
  • 2016/10/22 15:30 参考:http://blog.163.com/rongting_chen/blog/static/164906844201252354518462/ ... matlab版本:R2012a,64位,VS2010 1:C语言调用matlab引擎。  V
  • C调用MATLAB,据网上介绍主要有3种方法:1)、在C程序中调用MATLAB引擎;(本文)2)、将M文件编译生成dll文件供C程序使用;3)、将MATLAB程序编译成C/C++源文件并嵌入到C程序中。1、在C程序中调用MATLAB引擎...
  • 关于在Windows8.1 64位专业版系统中用C语言调用MATLAB生成的.dll文件的尝试关于在Windows8.1 64位专业版系统中用C语言调用MATLAB生成的.dll文件的尝试C 语言与 MATLAB 混合编程总结——关于在 Windows8.1 64 位专业...
  • #include "stdio.h"#include "tsin.h"int main(){if (!mclInitializeApplication(NULL,0)){printf("could not initialize the application!");exit(1);}if (!tsinInitialize()){printf("could not initialze the li....
  • 怎样在C/C++语言里调用Matlab EngineWindows下调用Matlab引擎要做好以下三点设置(1) 设置头文件目录(2) 设置库文件目录,并添加链接库输入项libeng.lib和libmx.lib(3) 设置环境变量以下以Visual Studio 2008为例来...
  • c语言调用matlab 例子

    2011-12-12 23:03:08
    c语言调用matlab引擎!!通过一个实例来说明!
  • c语言调用matlab

    2016-03-30 22:02:35
    很多种方法啊,我知道啊 可是我的matlab激活不...所以最好用的matlab engine环境配置包含目录增加:C:\Program Files\MATLAB\R2012b\extern\include 库目录增加:C:\Program Files\MATLAB\R2012b\extern\lib\win64\
  • 在这里我简要的以一个简单的例子来说明一下如果在VC中调用matlab中定义的.m文件。繁多的理论就不说了,简明扼要的说一个实例。相信大家看过之后 都会马上学会的其中灰色底显示的部分是需要我们手工输入的部...
  • c#调用matlab生成的dll

    2021-06-17 14:09:43
    c#调用matlab生成的dll 一、编写matlab代码 二、将.m文件编译成dll 三、在C#代码里调用dll
  • android调用matlab代码美思博 Python API 此 repo 包含 Mesibo Real-Time Python API 的源代码。 Mesibo 提供一切功能,使您的应用程序实时且可扩展,适用于前十亿用户和下一个用户。 它是模块化的、重量轻的并且...
  • c语言环境中调用matlab程序指南 - 道客巴巴 Makefile配置 C语言控制器目录下有一个Makefile文件,打开,找到这几行代码。 ### ---- Linked libraries ---- ### if your program needs additional libraries: #...
  • C语言改写的Matlab中的几个函数,适用于嵌入式设备。其中 void dwt_filter(double *inp,double *outa,double *outd, char *name,int len); char hampel(float *Y1, float *uhy, unsigned int len, unsigned int ...
  • 该程序包含利用matlab产生的dll文件,.h文件,.lib文件,以及利用VC++调用dll文件的源程序
  • VisualC 调用MATLAB引擎的关键.pdf
  • matlab和c++调用DLL方法(最新整理)》...1、MatlabC+调用 DLL 方法Matlab 可以调用外部 DLL,如用 CC+写的 DLL。本文分三个部分介绍 MatlabC+调用 DLL 方法。一、C+写 dll 方法二、C+调用 dll三、Matla...
  • 利用matlab编写了一个滤波程序,smooth.m。函数z=smooth(x);matlab中用mcc -l smooth.m生成了若干个文件,我们要利用的事smooth.h,smooth.lib,和smooth.dll放在vs 的项目smooth\smooth下面,项目smooth属性添加 vc++...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,752
精华内容 16,700
关键字:

c调用matlab

matlab 订阅