我的mex文件有什么问题?输入/输出定义? 我试图运行我的Max函数,我用C++编写了它,它在MATLAB中成功编译,但是返回了错误的值。我很确定,我没有读16乘21的输入矩阵gammas。有人能看出这里出了什么问题吗 void fun(double gammas[], int num1, int num2, int length, double a[]) { ... } void mexFunction(int nlhs, mxArray *plhs, int nrhs, const mxArray *prhs) { double *gammas, *a; int num1, num2, length; size_t mrows, mcols; mrows = 4; mcols = 21; length = 21; plhs[0] = mxCreateDoubleMatrix((mSize)mrows, (mwSize)ncols, mxREAL); gammas = mxGetPr(prhs[0]); num1 = (int)*mxGetPr(prhs[1]); num2 = (int)*mxGetPr(prhs[2]); a = mxGetPr(plhs[0]); fun(gammas, num1, num2, length, a); }

我的mex文件有什么问题?输入/输出定义? 我试图运行我的Max函数,我用C++编写了它,它在MATLAB中成功编译,但是返回了错误的值。我很确定,我没有读16乘21的输入矩阵gammas。有人能看出这里出了什么问题吗 void fun(double gammas[], int num1, int num2, int length, double a[]) { ... } void mexFunction(int nlhs, mxArray *plhs, int nrhs, const mxArray *prhs) { double *gammas, *a; int num1, num2, length; size_t mrows, mcols; mrows = 4; mcols = 21; length = 21; plhs[0] = mxCreateDoubleMatrix((mSize)mrows, (mwSize)ncols, mxREAL); gammas = mxGetPr(prhs[0]); num1 = (int)*mxGetPr(prhs[1]); num2 = (int)*mxGetPr(prhs[2]); a = mxGetPr(plhs[0]); fun(gammas, num1, num2, length, a); },c++,matlab,mex,C++,Matlab,Mex,当我在VS中调用“main”函数中的“fun”而不是“mex”函数并手动提供输入Gamma时,我得到了正确的“a”。在我的MATLAB代码中调用生成的mex文件时,我收到了错误的“a”。作为输入转置矩阵以解决行/列主要差异的替代方法,您可以在mex文件中处理转置。使用辅助器C++函数。您可以编写一个循环来复制元素,也可以通过mexCallMATLAB调用permute。如下所示: int permute2DMATtoC(mxArray*& matPermuted, const mxArr

当我在VS中调用“main”函数中的“fun”而不是“mex”函数并手动提供输入Gamma时,我得到了正确的“a”。在我的MATLAB代码中调用生成的mex文件时,我收到了错误的“a”。

作为输入转置矩阵以解决行/列主要差异的替代方法,您可以在mex文件中处理转置。使用辅助器C++函数。您可以编写一个循环来复制元素,也可以通过
mexCallMATLAB
调用
permute
。如下所示:

int permute2DMATtoC(mxArray*& matPermuted, const mxArray* mat)
{
    mxAssert(mxGetNumberOfDimensions(mat)<=3, "Requires 2D or 3D matrix.");

    mxArray *permuteRHSArgs[2];
    permuteRHSArgs[0] = const_cast<mxArray*>(mat);
    permuteRHSArgs[1] = mxCreateDoubleMatrix(1,3,mxREAL);

    mxGetPr(permuteRHSArgs[1])[0] = 2;
    mxGetPr(permuteRHSArgs[1])[1] = 1;
    mxGetPr(permuteRHSArgs[1])[2] = 3; // supports 2D and 3D

    return mexCallMATLAB(1, &matPermuted, 2, permuteRHSArgs, "permute");
}
注意:由于
matPermuted
由MATLAB管理,您不需要显式地销毁它来回收资源,但当您完成后,如果您愿意,您可以这样做:

mxDestroyArray(matPermuted);

对于RGB,可能需要将像素顺序(RGB-RGB-RGB-…)转换为平面顺序(RRRR…-GGGG…-BBBB…。

作为输入转置矩阵的替代方法,以解决行/列主要差异,您可以在MEX文件内处理转置。使用辅助器C++函数。您可以编写一个循环来复制元素,也可以通过
mexCallMATLAB
调用
permute
。如下所示:

int permute2DMATtoC(mxArray*& matPermuted, const mxArray* mat)
{
    mxAssert(mxGetNumberOfDimensions(mat)<=3, "Requires 2D or 3D matrix.");

    mxArray *permuteRHSArgs[2];
    permuteRHSArgs[0] = const_cast<mxArray*>(mat);
    permuteRHSArgs[1] = mxCreateDoubleMatrix(1,3,mxREAL);

    mxGetPr(permuteRHSArgs[1])[0] = 2;
    mxGetPr(permuteRHSArgs[1])[1] = 1;
    mxGetPr(permuteRHSArgs[1])[2] = 3; // supports 2D and 3D

    return mexCallMATLAB(1, &matPermuted, 2, permuteRHSArgs, "permute");
}
注意:由于
matPermuted
由MATLAB管理,您不需要显式地销毁它来回收资源,但当您完成后,如果您愿意,您可以这样做:

mxDestroyArray(matPermuted);

对于RGB,可能需要将像素顺序(RGB-RGB-RGB-…)转换为平面顺序(RRRR…-GGGG…-BBBB…)。

在对您的问题的评论中怀疑是由于matlab和c/c++如何将线性存储的阵列元素排序为内存中的1D阵列。Matlab使用顺序,而C/C++使用顺序

我不会建议您在调用mex函数之前进行置换,而是在mex函数内部进行置换。根据@chappjc的建议,使用
mexCallMatlab
调用
permute
,或者通过调用从坐标返回matlab的线性索引(无论维数多少)

旁注:需要确认并找到我读过的关于这方面的好文章,但matlab使用列主顺序,因为它更适合矩阵乘法(在访问内存缓存时创建的页面默认值更少,因此速度更快)。再次需要确认。。。但至少这种组织更适合按列而不是按行进行访问

编辑

顺便说一句,一些简单的代码(C#)可以从maltab的基于零的线性索引(与之相反)中获得坐标:

private static int[]getCoordinates fromMatlablineArindex(int索引,int[]arrayDims)
{
var ret=新整数[计数];
var count=arrayDims.Length;
对于(变量k=0;k
在对您的问题的评论中怀疑,这是由于matlab和c/c++如何将用于线性存储的数组元素排序为内存中的1D数组。Matlab使用顺序,而C/C++使用顺序

我不会建议您在调用mex函数之前进行置换,而是在mex函数内部进行置换。根据@chappjc的建议,使用
mexCallMatlab
调用
permute
,或者通过调用从坐标返回matlab的线性索引(无论维数多少)

旁注:需要确认并找到我读过的关于这方面的好文章,但matlab使用列主顺序,因为它更适合矩阵乘法(在访问内存缓存时创建的页面默认值更少,因此速度更快)。再次需要确认。。。但至少这种组织更适合按列而不是按行进行访问

编辑

顺便说一句,一些简单的代码(C#)可以从maltab的基于零的线性索引(与之相反)中获得坐标:

private static int[]getCoordinates fromMatlablineArindex(int索引,int[]arrayDims)
{
var ret=新整数[计数];
var count=arrayDims.Length;
对于(变量k=0;k
你能出示
fun()的签名吗?
a
应该是存储结果的地方吗?根据变量名判断,我假设您希望结果由
plhs
指向(我将其理解为“指向左侧的指针”)。在这种情况下,将左侧值强制转换为整数,然后将该整数传递给另一个函数不会将结果保存到
plhs
@Praetorian Yes“a”是输出/结果。结果是否不仅仅是您想要的或类似的转置?注意,线性存储是为matlab而c/c++是为。。。也许你两者都混在一起了?@citizensane gammas是一个16乘21的矩阵。是的,我把转置的伽马传递给同一个mex,它返回了正确的结果。谢谢你,疯狂的公民!你能出示
fun()
的签名吗?
a
应该是存储结果的地方吗?根据变量名判断,我假设您希望结果由
plhs
指向(我将其理解为“指向左侧的指针”)。在这种情况下,将左侧值强制转换为整数,然后将该整数传递给另一个函数不会将结果保存到
plhs
@Praetorian Yes“a”是输出/结果。结果是否不仅仅是您想要的或类似的转置?注意,线性存储是为matlab而c/c++是为。。。也许你两者都混在一起了?@citizensane gammas是一个16乘21的矩阵。是的,我把转置的伽玛传给了sa