2012-03-14 4 views
4

入力が整数で出力が整数の配列であるmex関数を作成しようとしています。 関数は次のようになります。int * myFunction(unsigned int N) でmexFunctionでは、私は事が第1の値であるint型の* variab変数を宣言してからmexファイルの出力にあるintの配列

N = mxGetScalar(prhs[0]); 

    /* assign a pointer to the output */ 
    siz= 2*ceil(log(1.0*N)/log(2.0)-0.5)+1; 
    plhs[0] = mxCreateDoubleMatrix(1,siz, mxREAL); 
    vari = (int*) mxGetPr(plhs[0]); */ 
    /* Call the subroutine. */ 
    vari = myFunction(N); 
    mexPrintf("The first value is %d\n", vari[0]); 

が正しいものである(および他のものをチェックし、同様に正確であった)が、ときに私が呼んでルーチンmxFunction(16)は、出力として0しか得られません。 私の出力はint型の配列なので、私は推測しますが、問題の解決方法はわかりません。何かヒント? 乾杯。

答えて

3

Matlabはデフォルトでダブルスを扱います。コードスニペットに基づいて次の例のようにmex関数で簡単にキャストすることができます。デモアルゴリズムを実行するmyFunctionを作成しました。データ型を返すのではなく、void型の関数にして、出力にポインタを渡してデータ型を設定します。 。 。

/*************************************************************************/ 
/* Header(s)                */ 
/*************************************************************************/ 
#include "mex.h" 
#include "math.h" 


/*************************************************************************/ 
/*the fabled myFunction             */ 
/*************************************************************************/ 
void myFunction(unsigned int N, unsigned int siz, double* output) 
{ 
    int sign = 1; 
    for(int ii=0; ii<siz; ++ii) 
    { 
     output[ii] = (double)(ii * sign + N); 
     sign *= -1; 
    } 

} 


/*************************************************************************/ 
/* Gateway function and error checking         */ 
/*************************************************************************/ 
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{ 
    /* variable declarations */ 
    unsigned int siz; 
    double N; 

    /* check the number of input and output parameters */ 
    if(nrhs!=1) 
     mexErrMsgTxt("One input arg expected"); 
    if(nlhs > 1) 
     mexErrMsgTxt("Too many outputs"); 

    N = mxGetScalar(prhs[0]); 

    /* assign a pointer to the output */ 
    siz= 2*ceil(log(1.0*N)/log(2.0)-0.5)+1; 
    plhs[0] = mxCreateDoubleMatrix(1,siz, mxREAL); 
    myFunction(N, siz, mxGetPr(plhs[0])); 
} 
+1

+1しかし、OPは、彼は配列を作成するために 'mxCreateNumericArray'または適切な' mxClassID'(例えばため。 'mxINT32_CLASS')と' mxCreateNumericMatrix'を使用する必要があり整数配列を望んでいるからです。そして 'mxGetData'を使って配列の先頭へのポインタを取得します。 – Praetorian

+0

公正な点ですが、OPは要件を明確にするために問題に付随するMatlabコードを提供していませんでした。彼らはそれが動作しないと不平を言うまで慎重の側面で誤って最高 – learnvst

関連する問題