📄 例11-7.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 + -