A.2.2使用Mex文件中的矩阵和数组

所有变量的基本mex类型为mxArray任何对象,如amatrix、元胞数组或结构体,都存储在此基本类型中。mxArray基本上与octave_value类inoct文件,因为它充当所有更专业类型的容器。

这里的mxArray结构体至少包含itrepresents变量的名称、维度、类型以及变量是实数的还是复数。它还可以包含许多附加字段,具体取决于的类型mxArray。有许多函数要创建mxArray结构体,包括mxCreateDoubleMatrix,mxCreateCellArray,mxCreateSparse,和泛型mxCreateNumericArray.

访问数组中数据的基本函数是mxGetPr因为mex接口假设复数数组的实部和虚部分别存储,因此存在等效函数mxGetPi这就得到了神奇的部分。这两个函数都只适用于双精度矩阵。通用函数mxGetDatamxGetImagData对所有矩阵类型执行相同的操作。例如

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,mxGetNumberOfElementsmxGetNumberOfDimensions以处理多维数组的维度。函数mxGetMmxGetN也可用于找到a二维矩阵(MxN矩阵)中的行和列的数量。


版权所有 © 2024-2025 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2