我使用 mxCreateSparse
在 MEX 中创建了一个稀疏矩阵.
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
。
最佳答案
pr
数组包含 xsize
元素,并且您访问该数组时索引超出范围。因此出现段违规。
我认为你的根本问题是你没有完全掌握稀疏矩阵在 MATLAB 中是如何存储的。我不是 MATLAB 实现细节方面的专家,但我记得它使用压缩列存储。
本质上有3个数组如下:
double pr[NZMAX]
包含NZMAX
非零值。int ir[NZMAX]
包含pr
中每个值的行号。int jc[m]
索引到pr
和ir
中,标识每个m
中的第一个项目> 专栏。
这是执行摘要,但我建议您更仔细地阅读详细信息。
关于c - Mex 稀疏矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6120319/