在MEX中创建稀疏矩阵

kod*_*der 6 c matlab mex sparse-matrix

如何在用C编写的MEX文件中创建2d稀疏矩阵.创建矩阵之后如何像C一样单独访问元素,比方说mat[i][j]

我厌倦了使用mxCreateNumericArray函数但我无法访问元素并将其作为稀疏矩阵.

请帮忙

Chr*_* A. 10

请参阅mxCreateSparse上的此页面. 然后,您将要查看mxSetPr,mxSetIrmxSetJc以及相应的"get"版本.

这是一个如何分配稀疏矩阵的例子. 我意识到这是一个旧的链接,但据我所知,它没有改变.

基本上,它的工作原理ir数据包含行索引.该jr数据包含指数到的名单ir阵列.例如,在如何分配稀疏矩阵的链接中,代码如下:

...
static double  static_pr_data[NZMAX] = {5.8, 6.2, 5.9, 6.1};
static int     static_ir_data[NZMAX] = {0, 2, 1, 3};
static int     static_jc_data[COLS+1] = {0, 2, 4};
...
Run Code Online (Sandbox Code Playgroud)

阵列static_jc_data告诉你指数static_jc_data[c]通过static_jc_data[c+1]-1static_pr_datastatic_ir_data对应于该列c的矩阵的.在该范围内(static_jc_data[c]static_jc_data[c+1]-1),条目static_pr_data为您static_ir_data提供矩阵中的值,并为您提供正确的行.

例如,这里的矩阵将是:

A = [ 5.8  0
      0    5.9
      6.2  0
      0    6.1];
Run Code Online (Sandbox Code Playgroud)

要回答你关于如何单独访问元素的问题,你必须寻找是否i,j存在个元素,如果它返回它,否则返回0.要做到这一点,你会从搜索static_ir_data[static_jc_data[j]]通过static_ir_data[static_jc_data[j+1]-1]看你是否i存在.如果是,则相应的条目static_pr_data将包含您的条目.如果没有,则返回0.

但是,通常使用稀疏矩阵,如果您在矩阵中进行大量搜索以查看是否存在某个元素,您可能需要考虑如何使用它.通常情况下,通过仅执行非零元素而不是搜索每个i,j条目来执行您正在执行的任何操作要好得多.

哦,还有最后一件事.请记住,在MEX代码中,所有索引都是基于0的,但它们在MATLAB中是1.这应该增加乐趣.

  • Jc数组比列数多一个.它是迄今为止列中非零元素数的累积和.这允许有效地确定给定列中的元素的数量. (2认同)