如何在 Matlab/Octave `mexFunction`(不是 nrhs)中确定数组的大小

Posted

技术标签:

【中文标题】如何在 Matlab/Octave `mexFunction`(不是 nrhs)中确定数组的大小【英文标题】:How to determine size of array in Matlab/Octave `mexFunction` (not nrhs) 【发布时间】:2016-06-21 23:11:21 【问题描述】:

我想为我的mexFunction 提供一个任意大小的数组,但不知何故无法在我的 C 代码中确定它的大小。我已经尝试过sizeof(prhs[0])(假设数组是第一个输入参数),但这总是返回 8 - 无论数组大小和类型如何。那么,有什么想法吗?顺便说一句,我正在使用 Octave。

【问题讨论】:

我猜你只是从 mex 接口和 C 开始(考虑到你认为 sizeof 会给你答案)。由于您使用的是 Octave,请尝试使用 oct file。 Octave 的 C++ API 将更简单,更类似于 Octave 语言本身。 但是无论如何要回答你的问题(我会再次强调,如果你使用 Octave,你最好使用 oct 文件),使用函数 mxGetNumberOfDimensionsmxGetDimensions .关于 Working with Matrices and Arrays in Mex-files 和 Octave's doxygen reference for mex interface 的 Octave 手册部分 感谢回复,虽然这里提出的解决方案可能是正确的,但每当我在 C 代码中使用这些函数时,Octave 就会崩溃。我会看一下 oct 文件。 【参考方案1】:

既然您在 cmets 中提到您正在尝试使用 oct 文件,下面是如何操作(您仍应阅读 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

如果你真的想使用 mex 接口,这里有一个没有任何检查的简化版本(如果你输入错误会出现段错误):

$ 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

【讨论】:

以上是关于如何在 Matlab/Octave `mexFunction`(不是 nrhs)中确定数组的大小的主要内容,如果未能解决你的问题,请参考以下文章

ILNumerics 等效于 MatLab/Octave 语句

MATLAB/Octave 不会缩短长数字

在 Matlab/Octave 中实现神经网络

通过将数字分组到一个范围内在 matlab / octave 中绘图

MATLAB/Octave 中的 LIBSVM - libsvmread 的输出是啥?

rand 函数是不是在 MATLAB/Octave 中产生 0 或 1 的值?