网关功能破坏了从matlab到c ++ mex程序的输入

时间:2015-03-24 11:48:16

标签: c++ matlab mex

我正在测试将稀疏矩阵从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。你知道为什么以及如何解决它吗?

2 个答案:

答案 0 :(得分:0)

val中有效值的范围是0nz-1(最多)。您正在复制M值。另请注意,x的有效范围是0N-1 - 但如果A为方形,则可能不会出现问题。

另请注意,如果A是稀疏的,则它不可能包含类型float的值,因为MATLAB仅支持doublelogical稀疏。您应该valdouble const *类型。

答案 1 :(得分:0)

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

我将val的初始化更改为

    double const *val = NULL; 

和输入:

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

大!