标签: matlab-engine

将数据从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
查看次数

从C++调用matlab

我试图从.cpp文件中调用matlab.我使用以下命令编译 engdemo.cpp包含的内容"engine.h"

g++ engdemo.cpp -I/usr/local/matlabR2010a/extern/include -L/usr/local/matlabR2010a/extern/lib -o engdemo
Run Code Online (Sandbox Code Playgroud)

我得到的是以下内容:

engdemo.cpp:(.text+0xdb): undefined reference to `engOpen'
engdemo.cpp:(.text+0x12d): undefined reference to `mxCreateDoubleMatrix'
engdemo.cpp:(.text+0x143): undefined reference to `mxGetPr'
engdemo.cpp:(.text+0x175): undefined reference to `engPutVariable'
engdemo.cpp:(.text+0x189): undefined reference to `engEvalString'
Run Code Online (Sandbox Code Playgroud)

...

collect2:ld返回1退出状态


我想这可能是一些链接问题,但我不确定.请帮帮我.提前谢谢了!

c++ matlab matlab-engine

6
推荐指数
1
解决办法
7226
查看次数

C指向Matlab变量的指针

我正在研究一个需要重复访问大型Matlab数据结构的C程序.这是一个使用OpenGL的图形密集型程序,因此必须快速.

使用Matlab Engine重复访问此数据结构似乎花费的时间太长(每次调用engGetVariable和engPutVariable约10-20毫秒).我认为这是因为这些函数将数据复制到内存中.

因此,不是在数据结构本身上使用engGetVariable,而是在尝试获取指向数据结构的指针.如果我在指针上调用engGetVariable,我可以通过取消引用指针来访问C中的数据结构,而不必先将数据复制到内存中.但是到目前为止我还没能让这个工作.这样的事情可能吗?

// Make vars in matlab workspace
engEvalString(ep, "a=9");
engEvalString(ep, "ap=getPointer(a)");

// Get variables in C
ap = engGetVariable(ep, "ap");
a = *mxGetPr(ap);

printf("a = %f", a);
Run Code Online (Sandbox Code Playgroud)

c matlab matlab-engine

6
推荐指数
1
解决办法
348
查看次数

使用MATLAB Engine连接已运行的MATLAB

MATLAB Engine API允许从C程序访问MATLAB功能.要设置MATLAB Engine会话,可以调用该engOpen函数.默认情况下,这将启动MATLAB的新实例,专门用于Engine应用程序.

我想要的是使用Engine应用程序中已经运行的 MATLAB会话,以便我可以访问它的变量. 我需要在Linux和OS X上执行此操作.

Engine接口在Windows(它使用COM服务器)和Unix上有非常不同的实现.在Unix上,我们必须将MATLAB可执行文件的位置传递给engOpenWindows,而在引擎使用COM服务器的情况下,我们不会.在Windows上可以使用MATLAB的现有实例Engine应用程序:只要运行enableservice('AutomationServer', true).在Unix系统上有什么解决方案吗?

我希望有一个通用的解决方案 - 可能没有文档 - 因为,基于文档,Python接口似乎允许这样做.我在OS X上测试了这个并且它可以工作.例如,我可以启动交互式MATLAB会话,设置变量a=5,然后启动Python,连接到同一个会话并能够检索此变量. 也可以从Java连接到已经运行的会话.

我需要从C开始,而不是从Python开始,因为它将在MATLink,Mathematica-MATLink接口中使用.Python界面如何实现这一目标?如何使用C重现相同的内容?

如果有一个替代的C API而不是"MATLAB Engine"使这成为可能(可能是Python接口所基于的其他一些文档化或​​未记录的C API),我可以接受这个作为答案.我想要一个可以利用已经运行的交互式 MATLAB会话的C程序.


更新:

Python界面中的一些讨论显示它使用了一个名为的库libmwengine_api.这与记录的MATLAB Engine C API不同.我们可以查看这个库中的符号.在OS X上,

nm -g libmwengine_api.dylib | c++filt
Run Code Online (Sandbox Code Playgroud)

然后我们可以谷歌搜索这些符号或grep MATLAB安装目录中包含它们的文件.出现了纯文本中没有任何内容.

基于此,我相信Python接口使用的是未记录的C++ Engine API,它与旧的C++引擎API不同.

c linux macos matlab matlab-engine

6
推荐指数
1
解决办法
593
查看次数

延迟在释放模式下加载dll

在我正在使用Visual Studio(C++ 2010 Express)构建的C项目中,我使用MatLab引擎允许用户提供在项目中使用的自定义函数.问题是此代码还需要能够在没有安装MatLab的计算机上运行,​​这意味着在这种情况下计算机上将无法使用所需的DLL.当然,这应该仅在用户不尝试访问调用matlab引擎的代码段时才有效(我已为此提供了一个标志).

我有3个dll是这个场景所需要的.

  • libmx.dll
  • libmex.dll
  • libeng.dll

到目前为止,我已经能够使用LoadLibraryGetProcAddress在运行时加载libeng.dll .另外两个DLL有点困难,除了调用MatLab引擎的C代码之外,代码也经常被编译为mex文件(MatLab可执行文件),以允许用户从MatLab调用它.当编译为mex文件时,libmx.dll和libmex.dll都由mex编译器动态链接.这意味着使用LoadLibraryGetProcAddress不适用于这些DLL.

现在我只是将libmx和libmex LIB添加到visual studio中的链接器属性,这样可以正常工作,但对于没有安装MatLab的人来说是不可能的.

我尝试使用delayLoad,如果我在调试模式下编译,这可行,但在我在发布模式下编译时会出现此构建错误.

1>C:\Program Files (x86)\MATLAB\R2012a\bin\win32\libmx.dll : fatal error LNK1107: invalid or corrupt file: cannot read at 0x2B8
Run Code Online (Sandbox Code Playgroud)

如果没有访问使用它们的代码部分,有没有办法完全跳过查找/加载这些DLL?

这是链接器的命令行:

/OUT:"C:\Users\A.Vandenber\documents\visual studio 2010\Projects\Flash\Release\Flash.exe" /NOLOGO "C:\Program Files (x86)\MATLAB\R2012a\bin\win32\libmx.lib" "C:\Program Files (x86)\MATLAB\R2012a\bin\win32\libmex.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DELAYLOAD:"libmex.dll" /DELAYLOAD:"libmx.dll" /MANIFEST /ManifestFile:"Release\Flash.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\Users\A.Vandenber\documents\visual studio 2010\Projects\Flash\Release\Flash.pdb" /OPT:REF /OPT:ICF /PGD:"C:\Users\A.Vandenber\documents\visual studio …
Run Code Online (Sandbox Code Playgroud)

c dll matlab matlab-engine visual-studio

6
推荐指数
1
解决办法
396
查看次数

MATLAB引擎与MATLAB编译器创建的库相比?

要用C或C++调用MATLAB代码,如何选择使用MATLAB引擎和使用MATLAB Compiler mcc从MATLAB代码创建C或C++共享库?它们的优缺点是什么?有关第二种方法,请参阅http://www.mathworks.com/access/helpdesk/help/toolbox/compiler/f2-9676.html

还有其他方法可以从C或C++调用MATLAB吗?

c c++ matlab matlab-engine matlab-compiler

5
推荐指数
1
解决办法
1413
查看次数

为什么 python 的 matlab.engine 这么慢?

我通过 MATLAB Engine for Python 从 Python 调用 MATLAB 函数,但速度相当慢。原始 MATLAB 脚本在我的系统上运行时间为 30 毫秒,而 python 脚本只需 5 秒多一点。

有理由吗?我应该怎么办?

蟒蛇代码:

import matlab.engine,time
start = time.clock()

eng = matlab.engine.start_matlab()
eng.forward


elapsed = (time.clock() - start)
print("Time used:",elapsed)

>>>  'Time used:', 4.879795798557371
Run Code Online (Sandbox Code Playgroud)

MATLAB 运行时:

forward |  0.029 s  |  0.015 s
Run Code Online (Sandbox Code Playgroud)

python matlab matlab-engine

5
推荐指数
1
解决办法
2074
查看次数

Matlab Engine Python - iPython 出现 OSx Anaconda Segfault 或 DYLD_LIBRARY_PATH 错误

在终端中安装 matlab python 包后,使用:

cd "matlabroot\extern\engines\python"
python setup.py install
Run Code Online (Sandbox Code Playgroud)

尝试运行它时,出现段错误:

:~$ python
Python 2.7.10 |Anaconda 2.3.0 (x86_64)| (default, May 28 2015, 17:04:42) 
[GCC 4.2.1 (Apple Inc. build 5577)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://binstar.org
>>> import matlab.engine
Segmentation fault: 11
Run Code Online (Sandbox Code Playgroud)

但是,我可以通过设置 DYLD_LIBRARY_PATH 来解决这个问题,然后 matlab.engine 就可以工作:

:~$ export DYLD_LIBRARY_PATH=/System/Library/Frameworks/Python.framework/Versions/Current/lib:$DYLD_LIBRARY_PATH
:~$ python
Python 2.7.6 (default, Sep  9 2014, 15:04:36) 
[GCC 4.2.1 Compatible Apple …
Run Code Online (Sandbox Code Playgroud)

python macos matlab matlab-engine anaconda

5
推荐指数
1
解决办法
998
查看次数

MATLAB中的数据流,输入数据来自C++可执行文件

我是MATLAB的新手,我想知道我对C++文件中数据流的选择.

我听说过为此目的使用MATLAB"引擎",以及像engPutVariable等一些方法,但有人可以给我一个如何去做的彻底的例子吗?我正在尝试实现正弦波流,但是通过发送样本数据集的简单示例就足够了.

c++ streaming matlab matlab-engine

4
推荐指数
1
解决办法
3393
查看次数

有没有办法改变MATLAB命令窗口的标题?

我正在使用C++ API启动MATLAB(通过engOpenSingleUse).一切都很好.但我想将窗口的标题从"MATLAB命令窗口"更改为其他内容.

我经常打开4或5个,如果我的程序崩溃,偶尔会有一个孤儿.如果我可以更改标题,我会更好地了解哪一个是哪个.

是否有一个MATLAB命令我可以执行(通过engEvalString)来执行此操作?

windows matlab matlab-engine

4
推荐指数
1
解决办法
2594
查看次数