稀疏矩阵的Octave格式与mex格式相同,因为它是压缩列稀疏格式。此外,在这两种实现方式中,稀疏矩阵都需要是二维的。对程序员来说,唯一重要的区别是矩阵的实部和虚部是分开存储的。
mex文件接口,除了使用mxGetM
,mxGetN
,mxSetM
,mxSetN
,mxGetPr
,mxGetPi
,mxSetPr
和mxSetPi
,还提供以下函数。
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
。作为返回的数组mxGetPr
和mxGetPi
只包含矩阵的非零值,我们还需要一个指向非零值元素行的指针,这从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