A.2.6具有Mex文件的稀疏矩阵

稀疏矩阵的Octave格式与mex格式相同,因为它是压缩列稀疏格式。此外,在这两种实现方式中,稀疏矩阵都需要是二维的。对程序员来说,唯一重要的区别是矩阵的实部和虚部是分开存储的。

mex文件接口,除了使用mxGetM,mxGetN,mxSetM,mxSetN,mxGetPr,mxGetPi,mxSetPrmxSetPi,还提供以下函数。

mwIndex*mxGetIr(const mxArray*ptr);mwIndex*mxGetJc(const mxArray*ptr);mwSize mxGetNzmax(const mxArray*ptr);void mxSetIr(mxArray*ptr,mwIndex*ir);void mxSetJc(mxArray*ptr,mwIndex*jc);void mxSetNzmax(mxArray*ptr,mwSize nzmax);

mxGetNzmax获取可存储在稀疏矩阵中的最大元素数。这不一定是稀疏矩阵中非零元素的数量。mxGetJc返回一个数组,该数组比稀疏矩阵中的列数多出一个值mxGetJc定义稀疏矩阵的每列中非零元素的数量。因此,

mwSize nz,n;mwIndex*Jc;mxArray*m;。。。n=mxGetN(m);Jc=mxGetJc(m);nz=Jc[n];

返回中矩阵中存储的非零元素的实际数量nz。作为返回的数组mxGetPrmxGetPi只包含矩阵的非零值,我们还需要一个指向非零值元素行的指针,这从mxGetIr.文件给出了在mex文件中使用稀疏矩阵的完整示例mysparse.c如下所示。

#include“mex.h”voidmexFunction(int nlhs,mxArray*plhs[],int nrhs,const mxArray*prhs[]){mwSize m,n,nz;mxArray*v;mwIndex i;double*pr,*pi;double*pr2,*pi2;mwIndex*ir,*jc;mwIndex*ir2,*jc2;if(nrhs!=1||!mxIssparse(prhs[0]))mexErrMsgTxt(“ARG1必须是稀疏矩阵”);m=mxGetM(prhs[0]);n=mxGetN(prGetN hs[0]);nz=mxGetNzmax(prhs[0]&&i!=0)i-;mexPrintf(“最后一个非零元素(%d,%d)=(%g,%g)\n”,ir[nz-1]+1,i,pr[nz-1],pi[nz-1]);v=mxCreatesparse(m,n,nz,mxCOMPLEX);pr2=mxGetPr(v);pi2=mxGetPi(v=2*pr[i];pi2[i]=2*pi[i];ir2[i]=ir[i];}对于(i=0;i<n+1;i++)jc2[i]=jc[i];如果(nlhs>0)plhs[0]=v;}else if(mxIsLogical(prhs[0])){mxLogical*pbr,*pbr2;mexPrintf(“矩阵是%d乘%d逻辑稀疏矩阵”,m,n);mexPrintef(“带有%d个元素”,nz);pbr=mxGetLogicals(prhs[0]);ir=mxGetIr(prhs[00]);jc=mxGetJc(prhs[2]);i=n;while(jc[i]==jc[i-1]&&i!=0)i-;mexPrintf(“最后一个非零元素(%d,%d)=%d\n“,ir[nz-1]+1,i,pbr[nz-1]);v=mxCreatesparseLogicalMatrix(m,n,nz);pbr2=mxGetLogicals(v);ir2=mxGetIr(v),jc2=mxGetJc;如果(nlhs>0)plhs[0]=v;}else{mexPrintf(“矩阵是%d-by-%d实稀疏矩阵”,m,n);mexPrintef(“具有%d个元素\n”,nz);pr=mxGetPr(prhs[0]);ir=mxGetIr(prhs[0]);jc=mxGetJc(prhs[0]);i=n;while(jc[i]=jc[i-1]&&i!=0)i-;mexPrintf(“最后一个非零元素(%d,%d)=%g\n”,ir[nz-1]+1,i,pr[nz-1]);v=mxCreatesparse(m,n,nz,mxREAL);pr2=mxGetPr(v);ir2=mxGetIr(v;如果(nlhs>0)plhs[0]=v;}}

的示例用法mysparse

sm=稀疏([1,0;0,pi]);mysparse(sm)⇒矩阵是具有2个元素的2乘2实稀疏矩阵,其中非零元素(2,2)=3.14159

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

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