我正在使用MEX接口在MATLAB中运行C++代码.我想在MATLAB中添加几个函数来处理System
对象:
sysInit()
sysRefresh()
sysSetAttribute(name, value)
String = sysGetAttribute(value)
sysExit()
Run Code Online (Sandbox Code Playgroud)
由于每个MEX dll可以包含一个函数,我需要找到一种方法来存储指向全局System
对象的指针,该对象将一直存在,直到被调用删除sysExit
.
我怎样才能在MATLAB中正确执行此操作?有没有办法在调用MEX函数时存储全局指针?
我写了一个以下形式的程序:
#include "stuff_I_need.h"
int main(){
construct_array(); // uses OpenMP pragma's
print_array();
return(0);
}
Run Code Online (Sandbox Code Playgroud)
使用以下命令正确编译,链接和运行:
`gcc44 -I/home/matteson/sundials/include/ main.c -lm -L/home/matteson/sundials/lib -lsundials_cvode -lsundials_nvecserial -fopenmp -o /home/matteson/MPI_test/CVODE_test/main_test`
Run Code Online (Sandbox Code Playgroud)
"gcc44"只是gcc 4.4版本,因为它是在一个维护多个版本gcc的集群上编译的.库sundials_cvode和sundials_nvecserial用于在构造阵列期间求解几个微分方程.
现在,当我想转移到Matlab并尝试编译表单的mex文件时:
#include "stuff_I_need.h"
void mexFunction(int nlhs,mxArray* plhs[], int nrhs, const mxArray* prhs[]){
construct_array(); // uses OpenMP pragma's
print_array();
}
Run Code Online (Sandbox Code Playgroud)
并尝试在Matlab中使用以下命令进行编译:
>> mex -v CC="gcc44" CFLAGS="\$CFLAGS -I/home/matteson/sundials/include/ -fopenmp" LDFLAGS="\$LDFLAGS -fopenmp -L/home/matteson/sundials/lib -lsundials_cvode -lsundials_nvecserial" mex_cvode.c
Run Code Online (Sandbox Code Playgroud)
我收到以下消息,最终导致链接错误:
-> mexopts.sh sourced from directory (DIR = $HOME/.matlab/$REL_VERSION)
FILE = /home/matteson/.matlab/R2010b/mexopts.sh
----------------------------------------------------------------
-> MATLAB = /misc/linux/64/opt/pkg/matlab/R2010b
-> CC = gcc44 …
Run Code Online (Sandbox Code Playgroud) 据我所知,mex函数的所有返回值都存储在mxArray*类型的plhs数组中.我想返回float类型的值.我该怎么做?
关于从mex函数返回它并从m文件中检索它的一些代码示例非常受欢迎.
我目前正在开发一个带有CUDA功能的mex文件,用于MATLAB.当我做错事(例如错误的指针或类似的东西)时,MATLAB总是崩溃(窗口提示我结束,发送报告进行数学运算或尝试继续).有没有办法防止这种情况发生?这样开发真的很烦人,但你可能知道自己:几乎没有人可以在没有"试错"的情况下编写完美的代码......到目前为止,谢谢!
我即将编写一个Mex文件,所以我可以在MATLAB中使用我的c ++代码.
此代码围绕单例类(在c ++中)构建.
我已经读过,因为内存要持久,我必须使用MxAlloc而不是malloc/new,这对我使用的所有内存都是如此吗?即,我使用矢量的类,矢量使用标准机制自动分配新的内存.
因此,使用MxAlloc分配的类中的向量是否难以保持其内存?
我试图索引为MATLAB编写外部c ++函数使用mex来操作矩阵,并且我无法使用多维索引.这里提供了一些示例,但我还没有找到如何解决下面描述的问题.我有一个样本矩阵:
>> mat
mat =
1 10
2 20
3 30
4 40
5 50
Run Code Online (Sandbox Code Playgroud)
目前我通过矩阵使用线性索引:
#include <mex.h>
#include <iostream>
using namespace std;
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
//1.get pointer to input graph_list and allocate it
double *graph_list = mxGetPr(prhs[0]);
mwSize mrows = mxGetM(prhs[0]);
mwSize ncols = mxGetN(prhs[0]);
cout<< mrows<<" rows\n";
cout<< ncols<<" cols\n";
int mm, nn;
for (nn=0;nn<ncols;nn++) {
for (mm=0;mm<mrows;mm++){
cout << graph_list[nn*(mrows) +mm] <<"\n";
}
}
}
Run Code Online (Sandbox Code Playgroud)
这会产生: …
我正在构建一个WCF服务,它将公开BasicHttp和NetTcp绑定.我还添加了两个相应的Mex端点,即
<service name="WCFTest.CalculatorService" behaviorConfiguration="WCFTest.CalculatorBehavior">
<host>
<baseAddresses>
<add baseAddress = "http://localhost:8000/WCFTest/CalculatorService/" />
<add baseAddress = "net.tcp://localhost:9000/WCFTest/CalculatorService/" />
</baseAddresses>
</host>
<endpoint address ="basicHttpEP" binding="basicHttpBinding" contract="WCFTest.ICalculatorService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
<endpoint address ="netTcpEP" binding="netTcpBinding" contract="WCFTest.ICalculatorService"/>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
</service>
Run Code Online (Sandbox Code Playgroud)
我真的需要添加NetTcp Mex端点以及BasicHttp Mex端点吗?客户不仅会总是使用Http mex端点进行元数据解析,而不管他们是否要使用tcp进行通信?
谢谢
我正在尝试在新版本(R2009a)上运行最初在Matlab 6.5上测试的程序.该程序使用了一些mex文件,并且在尝试运行时出现以下错误:
??? 无效的MEX文件'/normalizedCut/common_files/sparsifyc.mexglx':normalizedCut/common_files/sparsifyc.mexglx:符号mxGetIr,版本libmx.INTERNAL未在文件libmx.so中定义,带有链接时间参考.
(我试图修改的代码是Shi&Malic的Normalized cut,可以在这里找到:http: //www.cis.upenn.edu/~jshi/software/files/NcutClustering_7.zip)
如果我尝试在同一系统上运行代码,但Matlab 2007a运行正常.
2009a的向后兼容性有问题吗?系统中是否有任何标志我可以更改以帮助它工作?
当我用Google搜索它时,我看到了一些对LD_LIBRARY_PATH env变量的引用,但到底应该添加什么,我无法找到它.
谢谢,Yair
我试图弄清楚如何从mex函数访问存储在matlab结构中的字段中的矩阵.
这是非常冗长的...让我解释一下:
我有一个matlab结构,定义如下:
matrixStruct = struct('matrix', {4, 4, 4; 5, 5, 5; 6, 6 ,6})
Run Code Online (Sandbox Code Playgroud)
我有一个mex函数,我希望能够接收指向矩阵中第一个元素的指针(矩阵[0] [0],用c表示),但我一直无法弄清楚如何做那.
我尝试过以下方法:
/* Pointer to the first element in the matrix (supposedly)... */
double *ptr = mxGetPr(mxGetField(prhs[0], 0, "matrix");
/* Incrementing the pointer to access all values in the matrix */
for(i = 0; i < 3; i++){
printf("%f\n", *(ptr + (i * 3)));
printf("%f\n", *(ptr + 1 + (i * 3)));
printf("%f\n", *(ptr + 2 + (i * 3)));
}
Run Code Online (Sandbox Code Playgroud)
最终打印的内容如下:
4.000000
0.000000 …
Run Code Online (Sandbox Code Playgroud) 我试图在mex文件中运行FFTW代码.这完全是为了开发和测试的目的.经过一些谷歌搜索,我看到其他人试图做类似的事情,并有相关的问题,但我没有找到任何解决方案.在尝试运行mex文件时,Matlab告诉我:
??? 使用错误==> chirpTransform.mxCta无效的MEX文件'\ removed\my\directory\+ chirpTransform\mxCta.mexw32':找不到指定的过程.
.
我正在使用gnumex和MinGW来构建mex文件,因为LCC似乎有一些问题.我尝试过使用FFTW站点的32位DLL(http://www.fftw.org/install/windows.html).我尝试在Matlab 2009b bin目录中使用fftwf3.dll.我使用Msys/MinGW从源代码构建了dll.在所有情况下,结果都是相同的.在所有情况下,我都执行以下操作来生成lib文件.
c:\ gnumex\mexdlltool.exe -d libfftw3f-3.def -D libfftw3f-3.dll -l libfftw3f.lib --as C:\ MinGW\bin\as.exe
我也尝试使用visual studio lib.exe工具并尝试各种mexdlltool标志.
看来我可以使用Matlab的loadlibrary功能直接调用fftwf3-3.dll中的函数.由于DLL似乎不是问题,我尝试构建静态版本的fftwf3并将其直接链接到mex文件.我得到了相同的结果!如果我删除FFTW代码,mex文件运行正常.我刚刚放弃了这一点,而且我想要提出其他测试方法.