我想在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
我试图从.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退出状态
我想这可能是一些链接问题,但我不确定.请帮帮我.提前谢谢了!
我正在研究一个需要重复访问大型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) 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不同.
在我正在使用Visual Studio(C++ 2010 Express)构建的C项目中,我使用MatLab引擎允许用户提供在项目中使用的自定义函数.问题是此代码还需要能够在没有安装MatLab的计算机上运行,这意味着在这种情况下计算机上将无法使用所需的DLL.当然,这应该仅在用户不尝试访问调用matlab引擎的代码段时才有效(我已为此提供了一个标志).
我有3个dll是这个场景所需要的.
到目前为止,我已经能够使用LoadLibrary和GetProcAddress在运行时加载libeng.dll .另外两个DLL有点困难,除了调用MatLab引擎的C代码之外,代码也经常被编译为mex文件(MatLab可执行文件),以允许用户从MatLab调用它.当编译为mex文件时,libmx.dll和libmex.dll都由mex编译器动态链接.这意味着使用LoadLibrary和GetProcAddress不适用于这些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或C++调用MATLAB代码,如何选择使用MATLAB引擎和使用MATLAB Compiler mcc从MATLAB代码创建C或C++共享库?它们的优缺点是什么?有关第二种方法,请参阅http://www.mathworks.com/access/helpdesk/help/toolbox/compiler/f2-9676.html
还有其他方法可以从C或C++调用MATLAB吗?
我通过 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) 在终端中安装 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) 我是MATLAB的新手,我想知道我对C++文件中数据流的选择.
我听说过为此目的使用MATLAB"引擎",以及像engPutVariable等一些方法,但有人可以给我一个如何去做的彻底的例子吗?我正在尝试实现正弦波流,但是通过发送样本数据集的简单示例就足够了.
我正在使用C++ API启动MATLAB(通过engOpenSingleUse).一切都很好.但我想将窗口的标题从"MATLAB命令窗口"更改为其他内容.
我经常打开4或5个,如果我的程序崩溃,偶尔会有一个孤儿.如果我可以更改标题,我会更好地了解哪一个是哪个.
是否有一个MATLAB命令我可以执行(通过engEvalString)来执行此操作?