如何在 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 文件),使用函数 mxGetNumberOfDimensions
和 mxGetDimensions
.关于 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 中绘图