所有变量的基本mex类型为mxArray
任何对象,如amatrix、元胞数组或结构体,都存储在此基本类型中。mxArray
基本上与octave_value
类inoct文件,因为它充当所有更专业类型的容器。
这里的mxArray
结构体至少包含itrepresents变量的名称、维度、类型以及变量是实数的还是复数。它还可以包含许多附加字段,具体取决于的类型mxArray
。有许多函数要创建mxArray
结构体,包括mxCreateDoubleMatrix
,mxCreateCellArray
,mxCreateSparse
,和泛型mxCreateNumericArray
.
访问数组中数据的基本函数是mxGetPr
因为mex接口假设复数数组的实部和虚部分别存储,因此存在等效函数mxGetPi
这就得到了神奇的部分。这两个函数都只适用于双精度矩阵。通用函数mxGetData
和mxGetImagData
对所有矩阵类型执行相同的操作。例如
mxArray *m; mwSize *dims; UINT32_T *pr; dims = (mwSize *) mxMalloc (2 * sizeof (mwSize)); dims[0] = 2; dims[1] = 2; m = mxCreateNumericArray (2, dims, mxUINT32_CLASS, mxREAL); pr = (UINT32_T *) mxGetData (m);
还有一些函数mxSetPr
等,执行相反操作,并将数组的数据设置为使用的参数所指向的内存块mxSetPr
.
注意类型mwSize
上面使用的,以及mwIndex
,定义为在构建themex文件的平台上,Octave中索引的本机精度。这允许32位和64位平台都支持mex文件。mwSize
用于定义数组维度和元素的最大数量,而mwIndex
用于定义数组中的索引。
文件给出了一个示例,演示如何使用任意实数或复数双精度数组mypow2.c如下所示。
#include "mex.h" void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { mwSize n; mwIndex i; double *vri, *vro; if (nrhs != 1 || ! mxIsDouble (prhs[0])) mexErrMsgTxt ("ARG1 must be a double matrix"); n = mxGetNumberOfElements (prhs[0]); plhs[0] = mxCreateNumericArray (mxGetNumberOfDimensions (prhs[0]), mxGetDimensions (prhs[0]), mxGetClassID (prhs[0]), mxIsComplex (prhs[0])); vri = mxGetPr (prhs[0]); vro = mxGetPr (plhs[0]); if (mxIsComplex (prhs[0])) { double *vii, *vio; vii = mxGetPi (prhs[0]); vio = mxGetPi (plhs[0]); for (i = 0; i < n; i++) { vro[i] = vri[i] * vri[i] - vii[i] * vii[i]; vio[i] = 2 * vri[i] * vii[i]; } } else { for (i = 0; i < n; i++) vro[i] = vri[i] * vri[i]; } }
它的使用示例是
b = randn (4,1) + 1i * randn (4,1); all (b.^2 == mypow2 (b)) ⇒ 1
上面的例子使用了函数mxGetDimensions
,mxGetNumberOfElements
和mxGetNumberOfDimensions
以处理多维数组的维度。函数mxGetM
和mxGetN
也可用于找到a二维矩阵(MxN矩阵)中的行和列的数量。
版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2