⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 例11-7.m

📁 这是一个MATLAB7.0基础与提高例题的所有源码
💻 M
字号:
#include "mex.h"
/* 如果读者使用的编译器使用符号NaN表示0,那么在编译此例子
* 代码的时候读者必须使用标志-DNAN_EQUALS_ZERO ,例如:
* mex -DNAN_EQUALS_ZERO findnz.c  
*/
#if NAN_EQUALS_ZERO
#define IsNonZero(d) ((d) != 0.0 || mxIsNaN(d))
#else
#define IsNonZero(d) ((d) != 0.0)
#endif

void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])
{
  /* 声明变量*/ 
  int elements, j, number_of_dims, cmplx;
  int nnz = 0, count = 0; 
  double *pr, *pi, *pind;
  const int  *dim_array;         

  /* 检查输入输出参数个数*/    
  if (nrhs != 1) {
    mexErrMsgTxt("One input argument required.");
  } 
  if (nlhs > 1) {
    mexErrMsgTxt("Too many output arguments.");
  }

  /* 检查输入参数数据类型*/
  if (!(mxIsDouble(prhs[0]))) {
    mexErrMsgTxt("Input array must be of type double.");
  }
    
  /* 获得输入参数的元素个数*/
  elements = mxGetNumberOfElements(prhs[0]);

  /* 获得数据*/
  pr = (double *)mxGetPr(prhs[0]);
  pi = (double *)mxGetPi(prhs[0]);
  cmplx = ((pi == NULL) ? 0 : 1);

  /* 计算非0元素个数以便正确分配输出变量的内存大小*/
  for (j = 0; j < elements; j++) {
    if (IsNonZero(pr[j]) || (cmplx && IsNonZero(pi[j]))) {
      nnz++;
    }
  }

  /* 获得输入参数的维数并为返回参数分配空间*/
  number_of_dims = mxGetNumberOfDimensions(prhs[0]);
  plhs[0] = mxCreateDoubleMatrix(nnz, number_of_dims, mxREAL);
  pind = mxGetPr(plhs[0]);

  /* 获得输入参数的维数*/
  dim_array = mxGetDimensions(prhs[0]);

  /* 填写返回给MATLAB的索引数组,其中需要注意的是MATLAB中数组下标从1开始,C
语言中数组下标从0开始 */
  for (j = 0; j < elements; j++) {
    if (IsNonZero(pr[j]) || (cmplx && IsNonZero(pi[j]))) {
      int temp = j;
      int k;
      for (k = 0; k < number_of_dims; k++) {
        pind[nnz*k+count] = ((temp % (dim_array[k])) + 1);
        temp /= dim_array[k];
      }
      count++;
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -