1

を使用して MEX で疎行列を作成しましたmxCreateSparse

mxArray *W;
W=mxCreateSparse(n*n,n*n,xsize,mxREAL);
double *wpoint;
wpoint=mxGetPr(W);
for(p=0;p<xsize;p++)
 {
     Wpoint[(returnindex1(xi[p][0],xi[p][1])-1)*n*n + (returnindex1(xj[p][0],xj[p][1]))]=   exp(-df[p]/(SIGMAI*SIGMAI)) * exp(-dx[p]/(SIGMAJ*SIGMAJ));
 }

由来する最大値(returnindex1(xi[p][0],xi[p][1])-1)*n*n + (returnindex1(xj[p][0],xj[p][1]))n*n*n*nであり、次元の疎行列を作成しました(n*n)X(n*n)

マトリックス全体を表示すると、ゼロ要素の一部がジャンクになります。また、 の値が大きい場合、nでセグメンテーション違反が発生しwpointます。

4

1 に答える 1

0

pr配列は要素を保持し、xsize範囲外のインデックスで配列にアクセスします。したがって、セグ違反。

あなたの根本的な問題は、スパース行列が MATLAB にどのように格納されているかを完全に把握していないことだと思います。私は MATLAB 実装の詳細の専門家ではありませんが、圧縮された列ストレージを使用していることを思い出します。

本質的に、次の 3 つの配列があります。

  • double pr[NZMAX]NZMAXゼロ以外の値が含まれています。
  • int ir[NZMAX]の各値の行番号が含まれていますpr
  • int jc[m]各列の最初の項目にインデックスを付けてpr識別します。irm

以上がエグゼクティブサマリーですが、詳細をもっと注意深く読むことをお勧めします。

于 2011-05-25T10:14:24.473 に答える