在R2018a mxCreateSharedDataCopy不再支万博1manbetx持

2视图(30天)

这是一个错误消息我当编译C-mex文件

错误使用墨西哥人函数mxCreateSharedDataCopy不受支持的。万博1manbetx切换到使用更高效的MATLAB数据API可用在c++中墨西哥人的应用程序,或重新运行墨西哥人-R2017b命令行选项使用R2017b API。

不能看到任何远程相当于MATLAB数据API。这个功能对我来说非常重要,使墨西哥人更快的代码。什么是另一种选择,如果我们想使用R2018a(交错复杂的)和创建共享数据拷贝吗?

2的评论

登录置评。

答案(4)

Ned查尔斯
Ned查尔斯 2018年5月9日
我们想澄清一下,MEX files建于R2018a使用默认选项来墨西哥人命令不会看到如果他们使用非法API mxCreateSharedDataCopy构建错误。这些墨西哥人文件工作R2018a和旧版本(以及未来版本)。不可能构建mex files,选择新的交错复杂的API和使用非法mxCreateSharedDataCopy。mex files,选择交错复杂的只有在R2018a工作和将来的版本中。
可以构建墨西哥人的文件都使用交错复杂的数据,即写即拷完全文档化支持的行为。万博1manbetx数组创建c++ API自动使用MATLAB数据即写即拷没有任何特殊处理和知识所需的程序员。这些墨西哥人文件将在R2018a工作和将来的版本中。看到 //www.tianjin-qmedu.com/help/matlab/matlab_external/c-mex-functions.html 关于c++墨西哥人的更多信息。布鲁诺的问题,不仅可以一个c++墨西哥人与输入参数函数共享数据,但是数组的副本也在墨西哥人创建的文件将使用即写即拷。看到 //www.tianjin-qmedu.com/help/matlab/matlab_external/copy-cpp-api-matlab-arrays.html
我们没有记录或支持即写即拷mex files,因为我万博1manbetx们相信我们内部C API将过高MEX-File作者负担。没有提供的抽象和implementation-hiding c++, C API之间需要合作的所有代码使用的数组共享这副本写入数组数据之前。与c++ API,可以完全支持优化没有MEX-File作者需要采取任何特殊措施正确的万博1manbetx行为。MathWorks鼓励记录c++ API,因为它提供的性能即写即拷不麻烦的管理和风险管理错误从而导致错误,可能很难检测,诊断和修复。
1评论
詹姆斯Tursa
詹姆斯Tursa 2020年2月19日
编辑:詹姆斯Tursa 2020年2月24日
“…与c++ API,可以完全支持优化没有MEX-File作者需要采取任何特殊措施来获得万博1manbetx正确的行为……”
除非正确的行为是为了避免大量数据复制发生在后台没有直接控制用户。
作为一个墨西哥人的程序员,我不希望发生不能够控制什么时候发生。除非提供检验方法,程序员可以检测共享变量时(isaSharedDataCopy isaReferenceCopy,等等),这样下游算法可以避免大型深数据副本,这个新的c++接口有非常有限的使用对我来说……甚至没有使用。我需要能够 知道 当一个动作我要会或不会导致一个又大又深的数据复制。我目前读博士,我看不出有任何方法,允许我这样做。我知道TMW已经把大量的思想和精力到这个新c++接口,但你仍然让很多人冷落,直到你提供最低,这些检查方法。

登录置评。


1月
1月 2018年4月20日
编辑:1月 2018年4月20日
[评论多于一个答案:]
mxCreateSharedDataCopy没有记录。可能会有一个无证方法在2018数据API。
就好了,如果MathWorks提供了一个详尽的文档关于原地访问数组的墨西哥人的水平。我等待这个自1999年以来。
3评论
詹姆斯Tursa
詹姆斯Tursa 2018年4月27日
编辑:詹姆斯Tursa 2018年4月27日
因此,值得注意的是,这不是错误消息
“…未解决的外部符号……”
但正是这种
“…mxCreateSharedDataCopy不支持……万博1manbetx”
因此它不是函数不一定有,链接器无法找到它。似乎发生了什么是,墨西哥人命令本身是停止建设,因为它认为你试图与这个特定的函数。
创建共享数据复制功能仍然存在在MATLAB(容易验证通过一些简单的测试在命令行调试格式),事实上mxCreateSharedDataCopy函数仍然看起来存在libmx文件,但墨西哥人命令专门防止链接到它。这似乎是一个深思熟虑的决定,TMW,不是一个无意的疏忽。这可能是由于这一事实mxArray头被改变(如π指针被)和TMW不想写一个新函数,R2018a mxArray兼容,或者TMW试图引导你走向他们的c++数据API。无论如何这使得C程序员冷落,没有替代API函数来使用。
作为边注,非法mxCreateReference API函数实际上是在R2014a从libmx文件中删除。这是非常有用的在墨西哥人函数在处理单元和结构体变量。

登录置评。


短剑Luengo
短剑Luengo 2018年5月2日
编辑:短剑Luengo 2018年5月9日
注意,新的c++接口(引入R2018a)记录的方式创建共享数据副本:
我认为,展望未来,我们都需要去从R2018a c++接口。版本R2017b我们使用C接口与单独的真实和虚构的成分,和从R2018a我们使用c++接口与交错复杂的值。
我还没有开始用这个新界面,但似乎大大简化使用。我真的期待试试!:)
1评论
布鲁诺陈德良
布鲁诺陈德良 2018年5月4日
本文似乎是相关的问题,只是状态规则来创建一个新的副本,当数据被修改(因为MATLAB可以有另一个即时的共享数据的输入变量)。
我问的问题是能够创建一个新的即时共享数据与现有的mxArray变量,一个机制TMW保持内部使用。遗憾。我的许多墨西哥人代码现在突然变得效率低下或过时了。

登录置评。


布鲁诺陈德良
布鲁诺陈德良 2018年9月22日
编辑:布鲁诺陈德良 2020年10月28日
另一种解决方案是黑客mxArray内部结构
/ *文件“mxInternals_R2018B.h”* /
/ *砍内部MXARRAY定义* /
/ * Matlab版本:R2018b * /
#定义NumericalMask0 x00000080
#定义ComplexMask0 x00000800
#定义SparseMask0 x00000010
类型定义struct mxArray_tag mxArray_tag;
结构体mxArray_tag {
mxArray_tag* B_Xlink;
mxClassIDclassID;
无符号intunknown1;
mxArray_tag* F_Xlink;
mwSizendims;
无符号intrefcount;/ *数量mxArray *对象指向该结构* /
无符号int面具;/ *看到一些面具的价值观上面定义* /
联盟{
mwSize;/ *有效如果数组有< = 2维* /
mwSize* pSize;/ *矢量的大小,在有效的如果二维数组> * /
}大小;
mwSize关口;/ *如果二维数组>,这实际上是元素个数(X) / (X, 1)大小* /
联盟{
结构体{
无效*数据;
无符号intunknown0;
无符号intunknown1;
无符号intunknown2;
无符号intunknown3;
无符号intunknown4;
无符号intunknown5;
}number_array;
结构体{
void *数据;
mwIndex * pRowIndex;
mwIndex * pColFirstElement;/ * pColFirstElement [j]第一个元素的索引列j(见mxSetJc)。non-sparse元素的数量pColFirstElement关口* /
mwSizenzmax;/ *数量稀疏的非零元素分配数组* /
}sparse_array;
结构体{
mxArray_tag* *数据;
无符号intunknown1;
无符号intunknown2;
无符号intunknown3;
无符号intunknown4;
无符号intunknown5;
无符号intunknown6;
无符号intunknown7;
}cell_array;
结构体{
mxArray_tag* *数据;
void * pFieldNames;/ *注意:我有不知道如何存储字段名称* /
无符号intunknown1;
无符号intunknown2;
无符号intunknown3;
无符号intunknown4;
无符号intunknown5;
}struct_array;
}数据;
无符号intunknown3;
无符号intunknown4;
无符号intunknown5;
无符号intunknown6;
无符号intunknown7;
};
然后创建共享mxArray这样(沿着这条线可以处理更复杂的数据):
/ *
* B = mxCreateSharedMatrix2018 (A)
*
*输入:是真实的或复杂的双矩阵(即。,昏暗的= 2,不检查)
*
*创建一个数组B (mxArray不同比),但股票数据指针
*
* > >墨西哥人-R2018a mxCreateSharedMatrix2018.c
* /
#包括“mex.h”
#包括“mxInternals_R2018B.h”
#定义A_INprhs [0]
#定义A_OUTplhs [0]
无效mexFunction (int nlhs mxArray * plhs [], int nrhs, const mxArray * prhs [])
{
size_t m, n;
mxComplexity ComplexFlag;
mxArray_tag *, *礼帽;
如果(nrhs < 1) mexErrMsgTxt (“mxCreateSharedMatrix2018:一个输入必需的。”);
ComplexFlag = mxIsComplex (A_IN) ?mxCOMPLEX: mxREAL;
m = mxGetM (A_IN);
n = mxGetN (A_IN);
A_OUT = mxCreateDoubleMatrix (0, 0, ComplexFlag);
mxSetM (A_OUT, m);
mxSetN (A_OUT n);
是= (mxArray_tag *) A_IN;
差异= (mxArray_tag *) A_OUT;
/ *更新交联,插入礼帽的回* /
礼帽- > B_Xlink = Ain - > B_Xlink;
礼帽- > F_Xlink =还;
如果(对- > B_Xlink)差异- > B_Xlink - > F_Xlink =礼帽;
其他的礼帽- > B_Xlink =还;
如果(Ain - > F_Xlink = = NULL)是- > F_Xlink =礼帽;
是- > B_Xlink =礼帽;
/ *共享数据* /
礼帽- > data.number_array。Data = Ain - > data.number_array.Data;
/ *似乎我不需要更新refcount来向自己和* /
}
9日评论

登录置评。

类别

找到更多的在从MATLAB调用c++帮助中心文件交换

s manbetx 845

社区寻宝

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

开始狩猎!