我正在测试将稀疏矩阵从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。你知道为什么以及如何解决它吗?
答案 0 :(得分:0)
val
中有效值的范围是0
到nz-1
(最多)。您正在复制M
值。另请注意,x
的有效范围是0
到N-1
- 但如果A
为方形,则可能不会出现问题。
另请注意,如果A
是稀疏的,则它不可能包含类型float
的值,因为MATLAB仅支持double
和logical
稀疏。您应该val
为double const *
类型。
答案 1 :(得分:0)
非常感谢Edric!这解决了这个问题!
我将val的初始化更改为
double const *val = NULL;
和输入:
val = (double const *)mxGetPr (prhs[0]);
大!