标签: mex

如何告诉mex链接到/ usr/lib中的libstdc ++.so.6而不是MATLAB目录中的那个?

现在mex in MATLAB 2012a只正式支持gcc 4.4.6,但我想使用gcc 4.7,风险自负.现在,如果我直接用mex编译一些东西,它会抱怨

/usr/lib/gcc/i686-linux-gnu/4.7/cc1plus:
/usr/local/MATLAB/R2012a/sys/os/glnx86/libstdc++.so.6:
version `GLIBCXX_3.4.15' not found
(required by /usr/lib/i386-linux-gnu/libppl_c.so.4)

/usr/lib/gcc/i686-linux-gnu/4.7/cc1plus:
/usr/local/MATLAB/R2012a/sys/os/glnx86/libstdc++.so.6:
version `GLIBCXX_3.4.15' not found
(required by /usr/lib/i386-linux-gnu/libppl.so.9)
Run Code Online (Sandbox Code Playgroud)

通过strings /usr/lib/i386-linux-gnu/libstdc++.so.6 | grep 'GLIBCXX'本人确认libstdc++.so.6具有版本字符串.我检查mexopts.sh并修改了该变量$RPATH$MLIBS在该脚本中,但它不起作用.所以如果我不使用符号链接,我在哪里可以配置libstdc++.so.6mex使用的路径?谢谢.

linux matlab linker mex

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

在Numpy中设置*default*数据顺序(C vs. Fortran)

我正在将一些MATLAB代码移植到Numpy.此任务包括从某些C++代码中剥离MEX并将其替换为对Numpy的C-API的等效调用.一个问题是MEX代码将传入数据视为Fortran有序,因为这是MATLAB对其数组进行排序的方式.另一方面,Numpy默认使用C排序.

如果没有完全重写用于C排序的MEX代码,我可以:

  • (A)对进入C代码的数组进行重新排序,.copy('F')然后重新排序.copy('C')
  • (B)弄清楚如何通过从一开始就以Fortran顺序执行所有操作来"模仿"MATLAB.

选项A - 目前已实施 - 工作得很好,但非常低效.有谁知道如何使选项B工作?

python matlab numpy mex

11
推荐指数
1
解决办法
2163
查看次数

在MATLAB MEX库中使用boost,与MATLAB的版本不同

我们正在创建许多使用我们的通信库的MATLAB MEX文件.这个通信库经常使用Boost.现在,MATLAB也在内部使用boost,这意味着在标准设置中,我们不能使用不同于MATLAB附带的升级版本或随之而来的所有地狱.

问题是,我们的参考版本的matlab(boost 1.40)附带的boost版本已经很老了,并且有一些bug.我们非常想使用更新的版本.

我看到的唯一解决方案是创建一个生活在不同命名空间中的自定义版本的boost.然后,名称修改应该防止命名冲突.这个解决方案有点棘手,因为boost还会导出一些"C"符号并且有许多宏都需要更改.

是否有任何推荐的解决方案不需要创建自定义增强版本?

c++ matlab boost mex

11
推荐指数
1
解决办法
2334
查看次数

错误:无效的MEX文件,找不到指定的模块

我在笔记本电脑上成功编译了Mex文件.但是,当我运行它时,它说Invalid mex file 'c:\newfolder\filename.mexw32' The specified module could not be found.

System specification:  
OS: windows 7  
MATLAB 2010a  
Microsoft Visual Studio 2008.  
Run Code Online (Sandbox Code Playgroud)

在XP SP3下,我的PC上编译并运行相同的mex文件.

matlab mex

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

分析mex函数

我刚刚用c ++重写了一个matlab程序作为mex函数来加速,结果非常棒.这个优化决策是一个非常好的主意,在没有线程的情况下可以加速20倍.它仍然让我对mex-function花费时间和想要识别可能的瓶颈感到好奇.

我正在寻找一种分析mex功能的方法.matlab profiler用处不大,我下载的其他分析器(免费和试用版)都希望运行可执行文件.我不是mex-guru,但据我所知,运行mex的唯一方法是在Matlab中.mex-function被编译成一个dll,但被称为.mex64.所以这个问题应该类似于分析一个DLL.为了编写c ++ mex-function我使用的是单用户VS2005(即不是团队版本),而是在x64平台上运行.

有没有人知道配置mex功能的好方法?我应该使用什么工具,当我从Matlab开始时如何使用它?或者有没有其他方法来分析c ++代码?

matlab profiling mex

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

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万
查看次数

matlab mex文件的共享库位置:

我正在尝试编写一个使用libhdf5的matlab mex函数; 我的Linux安装提供了libhdf5-1.8共享库和头文件.但是,我的Matlab版本r2007b提供了1.6版本的libhdf5.so.(matlab .mat文件bootstrap hdf5,显然).当我编译mex时,它在Matlab中会出现段错误.如果我将我的libhdf5版本降级到1.6(不是长期选项),代码编译并运行正常.

问题:我该如何解决这个问题?如何告诉mex编译过程链接/usr/lib64/libhdf5.so.6而不是/opt/matlab/bin/glnxa64/libhdf5.so.0?当我尝试-Wl,-rpath-link,/usr/lib64在我的编译中使用时,我得到的错误如下:

/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: warning: libhdf5.so.0, needed by /opt/matlab/matlab75/bin/glnxa64/libmat.so, may conflict with libhdf5.so.6
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status

    mex: link of 'hdf5_read_strings.mexa64' failed.

make: *** [hdf5_read_strings.mexa64] Error 1
Run Code Online (Sandbox Code Playgroud)

ACK.最后一种方法是下载hdf5-1.6.5标题的本地副本并完成它,但这不是未来的证明(Matlab版本升级是我的未来.).有任何想法吗?

编辑:根据Ramashalanka的优秀建议,我

A)要求mex -v获得3个gcc命令; 最后一个是链接器命令;

B)用a -v来调用该链接器命令来获取collect命令;

C)调用它collect2 -v -t和其余的标志.

我输出的相关部分:

/usr/bin/ld: mode elf_x86_64
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crti.o
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/crtbeginS.o
hdf5_read_strings.o
mexversion.o
-lmx (/opt/matlab/matlab75/bin/glnxa64/libmx.so)
-lmex (/opt/matlab/matlab75/bin/glnxa64/libmex.so)
-lhdf5 (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/libhdf5.so)
/lib64/libz.so
-lm (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/libm.so) …
Run Code Online (Sandbox Code Playgroud)

matlab gcc rpath hdf5 mex

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

设置mex以使用Visual Studio 2010编译器

我安装了Visual Studio 2010.但是,MATLAB找不到编译器.

>> mex -setup
Please choose your compiler for building external interface (MEX) files: 

Would you like mex to locate installed compilers [y]/n? y

Select a compiler: 

[0] None 

Compiler:
Run Code Online (Sandbox Code Playgroud)

如果我回答n这个问题,我会得到以下信息

Would you like mex to locate installed compilers [y]/n? n

Select a compiler: 
[1] Intel C++ 11.1 (with Microsoft Visual C++ 2008 SP1 linker) 
[2] Intel C++ 9.1 (with Microsoft Visual C++ 2005 SP1 linker) 
[3] Intel Visual Fortran 11.1 (with Microsoft Visual C++ 2008 …
Run Code Online (Sandbox Code Playgroud)

configuration matlab mex visual-studio-2010

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

如何在MEX函数中读取整数数组

我将一个uint8类型的整数数组从MATLAB传递给MEX函数.我如何阅读这些值?我试过用:

int *n;
n = (int * ) mxGetData(prhs[0]);
Run Code Online (Sandbox Code Playgroud)

但价值观就像垃圾一样.我也试过了

double *n;
n= mxGetPr(prhs[0]);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,也会出现垃圾值.

这是什么解决方案?

基本上我想读取MEX函数中的整数值但mxGetPr返回double类型.

matlab mex

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

使用Matlab进行MEXing C时,size_t和mwSize之间的差异

我目前正在努力将一些C文件移植到64位Matlab,这些文件是用32位Matlab进行的.

在这样做时,我遇到了两种类型,一种来自Matlab人,一种来自C标准.

这是Matlab文档中关于mwSize的内容:

mwSize(C和Fortran)

输入大小值

描述

mwSize是一种表示大小值的类型,例如数组维度.使用此功能可实现跨平台灵活性.默认情况下,mwSize等效于C中的int.使用mex -largeArrayDims开关时,mwSize等效于C中的size_t.在Fortran中,mwSize类似于INTEGER*4或INTEGER*8,基于平台和编译标志.

这就是维基百科对size_t的评价:

size_t是由stddef.h中定义的几个C/C++标准(例如,C99 ISO/IEC 9899标准)定义的无符号数据类型.[1] 它可以通过包含stdlib.h进一步导入,因为这个文件内部子包含stddef.h [2].

此类型用于表示对象的大小.采用或返回大小的库函数期望它们属于此类型或返回类型为size_t.此外,最常用的基于编译器的运算符sizeof应该计算为与size_t兼容的值.

size_t的实际类型取决于平台; 一个常见的错误是假设size_t与unsigned int相同,这可能导致编程错误,[3] [4]例如从32位移植到64位架构时.

据我所知,这些类型实际上是相同的.我的问题是:1)是吗?2)如果是,哪一个被认为是更好的编程品味使用.理想情况下,我们希望我们的代码与未来的Matlab版本兼容.我猜测答案是mwSize,但我不确定.

编辑:我应该补充一点,Matlab人正在使用两者.例如,

size_t mxGetN(const mxArray *pm);
Run Code Online (Sandbox Code Playgroud)

是一个检索mxArray列数的函数.但是,当一个人创建矩阵时,人们会使用,

mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag);
Run Code Online (Sandbox Code Playgroud)

输入显然应该是mwSize.

c matlab types mex 32bit-64bit

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