标签: matlab-engine

如何从C++调用Matlab函数

我想在我的C++项目中调用MATLAB函数.

我正在使用Matlab R2010a和Visual Studio 2010

首先我创建了一个简单的matlab函数:

function y = foo(x)
    y = x+1;
Run Code Online (Sandbox Code Playgroud)

然后我用matlab编译器使用matlab GUI编译器编译这个函数(File-> new - > Deployment Project然后选择C++ shared Library).它生成这个文件2个文件夹:distrib和src.

distrib包含:

  1. foo.dll
  2. foo.h中
  3. foo.lib

src包含:

  1. Foo.cpp中
  2. foo.dll
  3. foo.exp
  4. foo.exports
  5. foo.h中
  6. foo.lib
  7. foo_mcc_component_data.c

我想在C++应用程序中使用此文件.我尝试了很多次,但我找不到办法.我在互联网上找到的所有方法都使用旧的matlab编译器,它可以生成不同的文件或在旧版本的visual studio上工作.

所以,任何人都可以帮助我吗?

我必须做什么?我必须添加哪些文件/参考文件?我必须定义哪些路径?

c c++ matlab matlab-engine matlab-deployment

15
推荐指数
2
解决办法
2万
查看次数

matlab中的C C++和C++中的matlab

似乎有几种方法可以在C C++中调用matlab并在matlab中调用C C++.当我尝试在这里列出它们时,请指出它如果我错过了什么.

要在matlab中调用C C++,还有两种方法.第一个是调用C共享库中的函数.第二个是将C C++代码构建为二进制MEX文件,这些文件将从MATLAB命令行调用.对于第一种方法,C共享库是否只是通用的,即没有改变他们的matlab的C代码,并从像gcc这样的通用C编译器编译?

要在C C++中调用matlab代码,有两种方法可用.第一个是Matlab引擎.第二个是使用MATLAB Compiler mcc从MATLAB代码创建C或C++共享库.

除了matlab和C++之外,C++还可以通过写入和从某些文件(例如mat文件,文本文件)读取数据来进行通信.

有多种方法可以实现这里的每个目标,你能告诉我哪些案例最适合使用哪些目标?即调用C共享库中的函数VS将C++代码构建成二进制MEX文件,Matlab引擎VS将Matlab代码编译成C C++共享库.

感谢致敬!

c matlab mex matlab-engine matlab-compiler

10
推荐指数
1
解决办法
1万
查看次数

问题包括用于C++代码的MATLAB"engine.h"

我试图从MATLAB Doc 运行示例代码,但是当我尝试在Visual Studio中构建项目时,我得到了这个错误

fatal error C1083: Cannot open include file: 'engine.h': No such file or directory
Run Code Online (Sandbox Code Playgroud)

事实是,在Doc中我无法找到链接它的标题的位置,它们显示示例就好像没有必要做任何其他事情,只是做了

#include "engine.h";
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题的任何想法?

编辑

我解决了第一个问题,但现在我得到了一些错误依赖于缺少的libs:

1>engwindemo.obj : error LNK2019: unresolved external symbol _engClose referenced in function _main
1>engwindemo.obj : error LNK2019: unresolved external symbol _mxGetClassName referenced in function _main
1>engwindemo.obj : error LNK2019: unresolved external symbol _engGetVariable referenced in function _main
1>engwindemo.obj : error LNK2019: unresolved external symbol _engOutputBuffer referenced in function _main
1>engwindemo.obj : error LNK2019: unresolved external symbol …
Run Code Online (Sandbox Code Playgroud)

c++ matlab visual-studio-2010 matlab-engine

10
推荐指数
1
解决办法
1万
查看次数

并行循环内的Matlab引擎

我在一段并行代码中使用多个matlab引擎时遇到了一些麻烦.我可以使用多个引擎成功生成多个引擎,engOpenSingleUse但无法与多个引擎通信(即调用engPutVariable失败).

与往常一样,最小(VS)示例:

#include "stdafx.h"
#include <engine.h>
#include <omp.h>

int _tmain(int argc, _TCHAR* argv[])
{
//First spawn the matlab engine sessions
Engine *m_Engines[2];
for (int i = 0; i < 2; i++)
{
    m_Engines[i] = engOpenSingleUse(NULL, NULL, NULL);
}

//Then spawn the worker threads...
#pragma omp parallel num_threads(2)
{   
    // Allocate an engine to each thread
    int thread_num = omp_get_thread_num();
    Engine *thisEngine = m_Engines[thread_num];

    #pragma omp for
    for (int i = 0; i < 10000; i++)
    { …
Run Code Online (Sandbox Code Playgroud)

c++ matlab openmp matlab-engine

9
推荐指数
1
解决办法
482
查看次数

如何有效地将Matlab引擎数组转换为numpy ndarray?

我目前正在开发一个项目,我需要使用传统的Matlab代码(使用Matlab引擎)进行一些处理,其余的则使用Python(numpy).

我注意到将Matlab的结果转换matlab.mlarray.double为numpy的结果numpy.ndarray看起来非常缓慢.

下面是一些示例代码,用于创建一个包含来自另一个ndarray,一个列表和一个mlarray的1000个元素的ndarray:

import timeit
setup_range = ("import numpy as np\n"
               "x = range(1000)")
setup_arange = ("import numpy as np\n"
                "x = np.arange(1000)")
setup_matlab = ("import numpy as np\n"
                "import matlab.engine\n"
                "eng = matlab.engine.start_matlab()\n"
                "x = eng.linspace(0., 1000.-1., 1000.)")
print 'From other array'
print timeit.timeit('np.array(x)', setup=setup_arange, number=1000)
print 'From list'
print timeit.timeit('np.array(x)', setup=setup_range, number=1000)
print 'From matlab'
print timeit.timeit('np.array(x)', setup=setup_matlab, number=1000)
Run Code Online (Sandbox Code Playgroud)

这需要以下时间:

From other array
0.00150722111994
From list
0.0705359556928
From matlab
7.0873282467
Run Code Online (Sandbox Code Playgroud)

转换大约需要从列表转换的100倍.

有没有办法加快转换?

python matlab numpy type-conversion matlab-engine

9
推荐指数
2
解决办法
3901
查看次数

Matlab引擎API的线程安全性

我通过反复试验发现MATLAB引擎函数不是完全线程安全的.

有谁知道规则?

通过反复试验发现:

在Windows上,与MATLAB的连接是通过COM进行的,因此COM Apartment线程规则适用.所有调用必须在同一个线程中进行,但只要每个连接都是隔离的,就可以在多个线程中进行多个连接.

从下面的答案来看,似乎在UNIX上不是这种情况,只要串行进行调用,就可以从多个线程进行调用.

c++ matlab thread-safety matlab-engine

8
推荐指数
2
解决办法
3007
查看次数

在Linux中从C连接到Matlab引擎

我试图从Linux上的C程序(Matlab r2009a,Ubuntu 9.10)以编程方式调用Matlab引擎.

我有自己的代码(适用于Windows),但是现在我只是想让Matlab"engdemo.c"程序在Linux上运行.我已经设法编译并链接它(在-l<lib>gcc命令行中包含大约15个开关之后),甚至通过一些ldconfig magic解决了所有运行时动态链接.

但是,当程序运行时,我只是得到"无法启动MATLAB引擎"错误消息并且程序结束,没有指示它失败的原因.

有人做过这项工作吗?我忘了做什么?

ps我最初在SuperUser上问过这个,因为我认为它与配置有关,但是我看到其他Matlab引擎相关的?在这里,所以我想我会试一试.

c linux matlab matlab-engine engopen

8
推荐指数
1
解决办法
2115
查看次数

通过g ++编译在Ubuntu 16.04中使用MATLAB Engine的c ++代码

我想询问有关如何编译在Ubuntu 16.04到g ++中使用MATLAB Engine的c ++代码的分析说明.

出于回答的目的,假设您使用默认matlab安装提供的示例代码之一来实现此目的.

在回答时请考虑我是linux,g ++和gcc编译工具的初学者.

c++ gcc g++ matlab-engine

8
推荐指数
1
解决办法
619
查看次数

将数据从cv :: Mat转换为mxArray

我想在c ++代码中使用"engine.h"将Matrix发送到Matlab.事实是我在cv :: Mat中有数据,我需要发送一个mxArray.我试图使用这个表达式,但它不起作用:

cv::Mat _priorP;
_priorP = Mat::eye(13, 13, CV_32FC1);
mxArray *mat;
mat = mxCreateDoubleMatrix(13, 13, mxREAL);

memcpy(mxGetPr(mat),_priorP.data, 13*13*sizeof(double));
Run Code Online (Sandbox Code Playgroud)

有人知道进行转换的正确方法吗?任何帮助都会被贬低.谢谢.

编辑

我发现了这种方式:https: //stackoverflow.com/a/8848711/744859

c++ opencv image-processing matlab-engine

7
推荐指数
2
解决办法
6070
查看次数

为MATLAB引擎设置处理器关联(Windows 7)

我正在用c ++开发一个应用程序.该应用程序的一个组件使用Matlab(通过Matlab引擎)进行数据处理.同时,数据采集系统将数据流传输到磁盘.偶尔,在强化Matlab处理期间,采集系统崩溃.通过将Matlab的处理器亲和性设置为可用处理器的子集,可以解决此问题.但是,由于应用程序每天启动几次,并且在多台计算机上,每次手动设置关联是不方便的.通过快捷方式的命令行设置处理器关联性的技巧不起作用,因为引擎是从我的应用程序内启动的,而不是通过快捷方式启动的.我一直在寻找一种以编程方式设置亲和力的方法,但成效有限.

我考虑了以下选项(按优先顺序排列):

  1. 在引擎启动时,从应用程序内指定matlab引擎的处理器关联.
  2. 为matlab引擎指定默认的处理器关联,与完整的Matlab应用程序本身分开.
  3. 作为最后的手段,为Matlab设置默认关联(引擎和非引擎使用).这是最不可取的,因为Matlab在部署机器上用于其他目的,并且最好不要将其限制用于其他用途.

是否可以在我的应用程序中设置处理器关联,如果是,如何设置?如果没有,解决这个问题的正确方法是什么?对这些选项或其他建议/解决方案的任何建议都将受到欢迎.

c++ matlab matlab-engine affinity windows-7

7
推荐指数
1
解决办法
1157
查看次数