2016-06-21 8 views
0

mexFunctionに任意のサイズの配列を渡したいのですが、何とか私のCコードのサイズを決定できません。私はすでにsizeof(prhs[0])(配列が最初の入力引数であると仮定します)を試しましたが、配列サイズと型に関係なく常に8を返します。だから、どんなアイデアですか?私は途中でOctaveを使用しています。Matlab/Octave `mexFunction`(nrhsではない)の配列のサイズを調べる方法

+2

私はあなただけMEXインターフェースから始まり、C(あなたは 'のsizeofと思ったことを考慮していると思います:MEXインターフェースは、ここに一切チェック(間違った入力を与えた場合、それはセグメンテーションフォールトします)との簡易版です'あなたに答えを与えてくれただろう)。 Octaveを使用しているので、代わりに[octファイル](https://www.gnu.org/software/octave/doc/interpreter/Oct_002dFiles.html#Oct_002dFiles)を試してください。 OctaveのC++ APIは、Octave言語自体に、よりシンプルで似ています。 – carandraug

+4

とにかくあなたの質問に答えるために(そして、Octaveを使っているなら、代わりにoctファイルを使うほうが良いと再度強調します)、関数 'mxGetNumberOfDimensions'と' mxGetDimensions'を使います。 Octaveのマニュアルセクション[Mex-filesでの行列と配列の操作](https://www.gnu.org/software/octave/doc/interpreter/Working-with-Matrices-and-Arrays-in-Mex_002dFiles.html) )と[mexインターフェイスのためのOctaveのdoxygenリファレンス](http://octave.org/doxygen/4.0/df/d4e/mex_8cc.html) – carandraug

+0

ここで提示された解決策はおそらく正しいものですが、返答のためのThnx、Octaveクラッシュ私のCコードで関数を使用するたびに。私はoctファイルを見ていきます。 – Smeik

答えて

1

あなたが10月ファイルを使用しようとしているコメントに言及したので、ここでは(あなたはまだoct-files上のマニュアルのセクションを経る必要があります)それを行う方法は次のとおりです。

$ cat foo.cc 
#include <octave/oct.h> 

DEFUN_DLD (foo, args, , 
      "foo help text") 
{ 
    if (args.length() != 1) 
    { 
     print_usage(); 
     return octave_value_list(); 
    } 

    const NDArray m = args(0).array_value(); 
    if (error_state) 
    { 
     error ("foo: first input must be a numeric N dimensional array"); 
     return octave_value_list(); 
    } 

    const dim_vector dims = m.dims(); 
    for (int i = 0; i < dims.length(); i++) 
    octave_stdout << "Dim " << i << " has length " << dims(i) << std::endl; 

    return octave_value_list(); 
} 
$ mkoctfile foo.cc 
$ octave 
octave:1> foo (rand (5, 3, 1, 2)) 
Dim 0 has length 5 
Dim 1 has length 3 
Dim 2 has length 1 
Dim 3 has length 2 
octave:2> foo ("bar") 
error: invalid conversion from string to real N-d array 
error: foo: first input must be a numeric N dimensional array 

あなたが本当に使用したい場合

$ cat foo.c 
#include "mex.h" 

void 
mexFunction (int nlhs, mxArray* plhs[], 
      int nrhs, const mxArray* prhs[]) 
{ 

    const mwSize nd = mxGetNumberOfDimensions (prhs[0]); 
    const mwSize* dims = mxGetDimensions (prhs[0]); 

    for (int i = 0; i < nd; i++) 
    mexPrintf("Dim %i has length %i\n", i, dims[i]); 

    return; 
} 
$ mkoctfile --mex foo.c 
$ octave 
octave:1> foo (rand (5, 2, 3)) 
Dim 0 has length 5 
Dim 1 has length 2 
Dim 2 has length 3 
関連する問題