编译器说明了一切。
在 C 语言中,二维数组就像数组的数组。因此,2D 数组与 1D 数组有根本的不同;它是一个指针数组,其中每个元素都包含一个指向数组的指针(因此是一个双指针,double**
).
你在问mxGetPr()
返回一个double**
,但它返回一个double*
,例如,指向一维数组第一个元素的指针。该一维数组只能被索引linearly.
我的猜测是 MATLAB 这样做是为了保持索引数组的一致性——您真的期望/想要一个double****
对于 4 维数组?
而且,mxGetPr()
不能通过返回类型重载(毕竟是 C)。
为了能够对一维数组进行双索引,您可以潜入一个小宏:
#define A(i,j) A[(i) + (j)*numrows]
并像这样使用它
double *A = mxGetPr(...);
int numrows = 4; /* or get with mxGetM() or so) */
double blah = A(3,2); /* call to MACRO */
显然,与所有宏一样,有一些事情需要注意:
- 没有边界检查
- C 是基于 0 的,而 Matlab 是基于 1 的,使得所有指数不同
- 所有数组都必须称为“A”
您可以编写一个函数来减轻这些缺点:
double getValue(double** array, int row, int* dims);
(or use mxCalcSingleSubscript
正如所指出的Shai https://stackoverflow.com/a/16146795/1714410),但这并不能真正提高表达能力恕我直言:
double blah = getValue(array, 3,4, dims);
/* or the ugliness from mxCalcSingleSubscript(); */
您还可以用 C++ 编写,创建一个带有operator()
,用指针和尺寸构造它mxGetPr()
and mxGetDims()
等等,在Matlab中编译使用g++
或等效的,但这引入了一大堆其他问题,并且增加了比大多数情况所需的复杂性得多的方法。
因此,为了避免所有这些混乱,我总是就地计算索引:)