Mex разреженная матрица - PullRequest
1 голос
/ 25 мая 2011

Я создал разреженную матрицу в 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.

1 Ответ

0 голосов
/ 25 мая 2011

Массив pr содержит xsize элементов, и вы получаете доступ к массиву с индексами за пределами границ. Отсюда и нарушение сегмента.

Я думаю, что ваша основная проблема в том, что вы не до конца поняли, как разреженные матрицы хранятся в MATLAB. Я не эксперт по деталям реализации MATLAB, но я помню, что он использует сжатое хранилище столбцов.

По сути, есть 3 массива следующим образом:

  • double pr[NZMAX], который содержит NZMAX ненулевые значения.
  • int ir[NZMAX], который содержит номер строки каждого значения в pr.
  • int jc[m], который индексирует в pr и ir, идентифицируя первый элемент в каждом из столбцов m.

Это краткое изложение, но я рекомендую вам внимательно прочитать детали.

...