gpt4 book ai didi

c++ - 我的 mex 文件有什么问题?输入/输出定义?

转载 作者:行者123 更新时间:2023-11-30 01:49:43 30 4
gpt4 key购买 nike

我正在尝试运行我在 VS 中用 C++ 编写的 mex 函数。它在 MATLAB 中编译成功但返回错误值。我非常确定,我不是在读取 16×21 输入矩阵 Gamma 。有人能看出这里出了什么问题吗?

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);
}

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

最佳答案

正如在对您的问题的评论中所怀疑的那样,问题是由于 matlab 和 c/c++ 如何将线性存储的数组元素排序为内存中的一维数组。 Matlab 使用 column-major C/C++ 使用 row-major 时的顺序.

我不建议您在调用 mex 函数之前进行排列,而是建议您在 mex 函数内部进行排列。按照@chappjc 的建议,使用mexCallMatlab 调用permute 或调用mxCalcSingleSubscript。它从坐标(无论维数是多少)返回 matlab 的线性索引。

旁注:需要确认并找回我读过的很棒的文章,但 matlab 使用列优先排序,因为它更适合矩阵乘法(访问内存缓存时创建较少的页面默认值,因此速度更快)。再次需要确认 ...但至少这个组织更适合按列而不是按行访问...

编辑

顺便说一句,一些简单的代码 (C#) 从 maltab 的基于零的线性索引(mxCalcSingleSubscript 的反向)获取坐标:

private static int[] getCoordinatesFromMatlabLinearIndex(int index, int[] arrayDims)
{
var ret = new int[count];
var count = arrayDims.Length;
for (var k = 0; k < count; k++)
{
index = Math.DivRem(index, arrayDims[k], out ret[k]);
}

return ret;
}

关于c++ - 我的 mex 文件有什么问题?输入/输出定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28613781/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com