网关函数损坏了从matlab到c++mex程序的输入

Gateway function corrupting input from matlab to c++ mex program

本文关键字:c++mex 程序 输入 matlab 函数 损坏 坏了 网关      更新时间:2023-10-16

我正在测试将一个稀疏矩阵从matlab传递到c++mex程序。当我返回我发送到数组中的变量时,数组会被破坏。你知道怎么解决这个问题吗?

    #include "mex.h"
    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const   mxArray *prhs[]){

int M = 0, N = 0, nz = 0, *I = NULL, *J = NULL;
float *val = NULL;
float *x;
float *rhs;

M = (int)mxGetM (prhs[0]);
N = (int)mxGetN (prhs[0]);
nz = (int)mxGetNzmax (prhs[0]);
val = (float *)mxGetPr (prhs[0]);
I = (int *)mxGetIr (prhs[0]);
J = (int *)mxGetJc (prhs[0]);
rhs = (float *)mxGetData(prhs[1]);//b-vec
plhs[0] = mxCreateNumericMatrix(N, 1, mxSINGLE_CLASS, mxREAL);
x = (float *)mxGetData(plhs[0]);
//DisplayMatrix("Input", rhs, N, 1);
//Test
for(int i = 0; i<M; i++){
    x[i] = val[i];
}
printf("%d",M);
}

所以当做一个稀疏的五对角矩阵并用x=mf(a,b)调用这个函数时;返回的x中的条目从例如0.3放大到
01e38.你知道为什么以及如何修复它吗?

val中的有效值范围为从0nz-1(最多)。您正在复制M值。此外,请注意,x的有效范围是从0N-1,但如果您的A是平方的,这可能不是问题。

此外,请注意,如果A是稀疏的,则它不可能包含float类型的值,因为MATLAB仅支持用于稀疏的doublelogical。您应该使val的类型为double const *

非常感谢Edric!这解决了问题!

我将val的初始化更改为

    double const *val = NULL; 

和输入:

    val = (double const *)mxGetPr (prhs[0]); 

太棒了!