应该是简单的阅读.mat通过c++的类实例,但不是吗

1视图(30天)
你好:
我想写一个类实例通过Matlab和读它从一个c++程序。从Matlab编写文件,打开它在c++中,识别类的类型都为我工作。阅读类属性不工作。
截图说明了一切:
在Matlab(编辑器和命令窗口显示在左):
简单,我定义了一个类有三个标量属性
——我实例化类和写文件
VS2013(源代码编辑器在中间偏右,调试器控制台窗口右上方):
-我打开文件通过c++使用matOpen控制台应用程序(在源编辑器中不可见,但成功)
——我叫matGetDir枚举变量的名字
——我循环变量,调用每一个matGetVariable
——我检查确认我们发现这个名字“简单”的一个实例,可见DOS窗口右上角的屏幕截图
——我发现零元素,零字段,和二维。这听起来并不好。
——mxIsClass验证mxArray拥有简单的实例。
——mxIsEmpty返回true。这听起来并不好。
——我开始寻找属性通过mxGetProperty检查变异可能会奏效。没有被发现。
这里我有一个基本的误解。有人有什么建议吗?
非常感谢
马太福音

接受的答案

马修·布里顿
马修·布里顿 2014年10月28日
SK:
你似乎已经确定了问题的根源:不Matlab支持用户定义的类I / O。金宝app自然我很失望,但是感谢你stick-to-it-iveness。
我将查看图书馆的建议。
非常感谢马修

更多的答案(10)

SK
SK 2014年10月25日
编辑:SK 2014年10月25日
看不出任何错误在您的代码中。
或许你可以做一个改变。试着用matGetNextVariable(),而不是matGetVariable ()。
我也注意到你在调试器停止。你是否检查的价值“num”?它是1或大于1。
1评论
马修·布里顿
马修·布里顿 2014年10月27日
谢谢你的回复。
调用matGetNextVariable返回null,如附件截图所示。
matGetDir返回的num的值是1。
非常感谢马
tthew

登录置评。


SK
SK 2014年10月27日
编辑:SK 2014年10月27日
好的,你的受害者漠不关心文档。
如果你检查matdgns示例。c文件在matlab安装:
(MATLAB) \走读生\ \ eng_mat例子
你会找到所需的信息:宝石
/ *
*获取目录的MAT-file
* /
dir = (const char * *) matGetDir (pmat &ndir);
如果(dir = = NULL) {
printf (“错误阅读目录的文件% s \ n”、文件);
返回(1);
}其他的{
printf (“% s的目录:\ n”、文件);
(i = 0;我< ndir;我+ +)
printf (“% s \ n”dir[我]);
}
mxFree (dir);
/ *以正确地使用matGetNextXXX,重启文件读头。* /
如果(matClose (pmat) ! = 0) {
printf (“错误关闭文件% s \ n”、文件);
返回(1);
}
pmat = matOpen(文件,“r”);
如果(pmat = = NULL) {
printf (“错误重新开放文件% s \ n”、文件);
返回(1);
}
所以在使用matGetDir()你必须关闭文件并重新打开它,以从文件读取的变量。大概读指针matGetDir后在错误的地方()。
的问候。

马修·布里顿
马修·布里顿 2014年10月27日
SK:
再次感谢您的回应。我希望matlab提供了一个示例打开一个类实例…
在你的建议后,我:
——修改了代码matGetDir后关闭并重新打开文件
——添加调用matGetNextVariableInfo matdgns。c的例子
——关闭和开放的文件了
——matGetNextVariable来检索类实例
一样,经历了失败找任何属性我最初报道。
下面的截图是。
非常感谢
马太福音

SK
SK 2014年10月27日
编辑:SK 2014年10月27日
下面的作品在我的系统和VS 2013 2014 (matlab)编译。所有的错误检查省略,以避免过多的输入。
在ReadMatFile.cpp
#包括“mex.h”
#包括“mat.h”
无效mexFunction (int nlhs mxArray * plhs [], int nrhs, const mxArray * prhs [])
{
const char * pmatfilename = mxArrayToString (prhs [0]);
MATFile * mfp = matOpen (pmatfilename“r”);
int numvars = 0;
char * * pmatfileinfo = matGetDir (mfp &numvars);/ /虚拟测试打开/关闭
matClose (mfp);
mfp = matOpen (pmatfilename,“r”);
const char *名称= 0;
mxArray * pa = matGetNextVariable (mfp名称);
const mxArray * pProp = 0;
const char * pStr = 0;
(pa ! = NULL)
{
mexPrintf(名称);
pProp = mxGetProperty (pa, 0,“prop_1”);
pStr = mxArrayToString (pProp);
mexPrintf (pStr);
pProp = mxGetProperty (pa, 0,“prop_2”);
pStr = mxArrayToString (pProp);
mexPrintf (pStr);
mxDestroyArray (pa);
pa = matGetNextVariable (mfp、名称);
}
mxFree (pmatfileinfo);
matClose (mfp);
}
更好的代码复制并粘贴到文本框,而不是提供一个截图,否则这是一种痛苦。
matlab类是:
classdef测试
属性
prop_1;
prop_2;
结束
方法(访问=“公共”)
函数这=测试(p1, p2)
这一点。prop_1 = p1;
这一点。prop_2 = p2;
结束
结束
结束
> > txx =测试(“12345”,“sdfadfdf”);
> > save (“test.mat”,“txx”);
> >墨西哥人ReadMatFile.cpp
> > ReadMatFile (“test.mat”);
txx12345sdfadfdf
2的评论

登录置评。


马修·布里顿
马修·布里顿 2014年10月27日
SK:
谢谢你的代码片段。我成功地复制你的结果通过Matlab命令窗口。相同的代码片段不成功找到类属性,当编译成一个控制台应用程序,并通过调试器执行。我得到同样的行为在我之前的文章:mxGetProperty返回NULL。
我看到Matlab知道如何编译的代码片段通过Matlab命令窗口,当我得到消息:
> >墨西哥人ReadMatFile.cppBuilding with 'Microsoft Visual C++ 2013 Professional'. MEX completed successfully.
在matlab从VS,我联系包括文件和库为了声明/定义库的符号(如matOpen)。这是一个不受支持的方法,还金宝app是有一些文档,告诉我如何成功链接吗?(Matlab命令窗口似乎知道这是如何实现的。)
非常感谢马修
1评论
SK
SK 2014年10月28日
编辑:SK 2014年10月28日
应该工作。我编译dll (mexw64)使用与唯一的问题是如何通过Matlab数据是通过mexFunction。但在你的情况下我认为你不传递任何数据从Matlab据我所知没有必要mexFunction。你连接在正确的matlab图书馆吗
(MATLAB}走读生微软\ \ lib \ win32 \
(MATLAB}走读生微软\ \ lib \ win64 \
根据您的系统。
你可以尝试的另一件事是使用:
墨西哥人- v ReadMatFile.cpp
从墨西哥人产生详细的输出。这将告诉你visual c++编译器选项,墨西哥人使用。确保你对编译器选项是兼容的。(你不需要/出口:mexFunction连接程序中国旗,也不需要MATLAB_MEX_FILE预处理器定义和目标将. exe而不是mexw64。)

登录置评。


马修·布里顿
马修·布里顿 2014年10月28日
SK:
我尝试以下代码,稍微修改上面例子从你提供主要(),加上少量的错误检查:
#包括“mex.h”
#包括“mat.h”
/ /无效mexFunction (int nlhs mxArray * plhs [], int nrhs, const mxArray * prhs [])
int主要(int命令行参数个数,char * argv [])
{
const char * pmatfilename =“C: \ \ \ \ mbritton \ \用户桌面\ \ test.mat”;
MATFile * mfp = matOpen (pmatfilename“r”);
int numvars = 0;
char * * pmatfileinfo = matGetDir (mfp &numvars);/ /虚拟测试打开/关闭
matClose (mfp);
mfp = matOpen (pmatfilename,“r”);
const char *名称= 0;
mxArray * pa = matGetNextVariable (mfp名称);
const mxArray * pProp = 0;
const char * pStr = 0;
(pa ! = NULL)
{
mexPrintf(名称);
mexPrintf (“\ n”);
pProp = mxGetProperty (pa, 0,“prop_1”);
如果(pProp = = NULL) mexPrintf (“零\ n”);
其他的{
pStr = mxArrayToString (pProp);
mexPrintf (pStr);
}
pProp = mxGetProperty (pa, 0,“prop_2”);
如果(pProp = = NULL) mexPrintf (“零\ n”);
其他的{
pStr = mxArrayToString (pProp);
mexPrintf (pStr);
}
mxDestroyArray (pa);
pa = matGetNextVariable (mfp、名称);
}
mxFree (pmatfileinfo);
matClose (mfp);
}
这是属性页面显示编译和链接线,把R2014a包括和win64 lib目录。
运行的结果是一样的:
我把日记包含输出文件
墨西哥人- v Source1.cpp
(Source1。cpp ReadMatFile的副本。cpp,我无意中重命名)。
有不同的编译/链接线。
和DLL来复制你的成功,我将这段代码与声明一个DLL
无效mexFunction (int nlhs mxArray * plhs [], int nrhs, const mxArray * prhs [])
而不是
int主要(int命令行参数个数,char * argv [])
从主要通过调试器和调用这个函数。我有相同的零的结果。
似乎有一些特定的Matlab在编译/链接,我没有成功地复制在VS。
非常感谢
马太福音

SK
SK 2014年10月28日
编辑:SK 2014年10月28日
事实上,我只有使用dll的墨西哥人和mx API不是matXXX API。我以后会对你的代码进行测试,但有一件事我注意到在日记文件:
COMPFLAGS:/ Zp8
现在8字节包装是微软默认编译器根据 文档 也许你可以试着说国旗贵族统治。也尝试添加MX_COMPAT_32预处理标记存在的日志文件:
/ DMX_COMPAT_32

马修·布里顿
马修·布里顿 2014年10月28日
SK:
谢谢你的建议。不要抢占你尝试代码,但我继续和添加/ Zp8和/ DMX_COMPAT_32,如下所示。
结果是一样的:mxGetProperty返回null。
非常感谢马修

SK
SK 2014年10月28日
编辑:SK 2014年10月28日
另一方面坏消息 页面:
“MAT-File界面库不支持MATLAB对象由用户定义的类”。金宝app
所以正式阅读不支持用户定义的对象。金宝app也许这与墨西哥人的侥幸。也许你可以检查这个 图书馆 完全避免了mat-File API,依赖于出版垫文件格式。

SK
SK 2014年10月28日
有时我想有努力学习的方式,但最终你总是学习,所以努力没有白费。或许你可以上面标记为答案。它可以帮助一些贫困的人也有同样的问题。
祝你好运。
的问候。

类别

找到更多的在从MATLAB编写C函数调用(墨西哥人文件)帮助中心文件交换

标签

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!