📄 findnz.c
字号:
#include "mex.h"
/* 若使用的编译器中NaN等同于0,则必须按照下面的格式编译此文件:
* 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[])
{
/* 变量声明 */
mwSize elements,j,cmplx;
mwSize number_of_dims;
mwSize nnz=0, count=0;
double *pr, *pi, *pind;
const mwSize *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);
/* 为非零值计数,以便为输出参数分配合适大小的内存 */
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开始
* 所以得到的索引值需加1
*/
for(j=0;j<elements;j++) {
if(IsNonZero(pr[j]) || (cmplx && IsNonZero(pi[j]))) {
mwSize temp=j;
mwSize k;
for (k=0;k<number_of_dims;k++){
pind[nnz*k+count]=(double)((temp % (dim_array[k])) +1);
temp/=dim_array[k];
}
count++;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -