6

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

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

请帮忙

4

1 回答 1

10

请参阅 mxCreateSparse 上的此页面。 然后,您需要查看mxSetPrmxSetIrmxSetJc以及相应的“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};
...

该数组static_jc_data告诉您索引static_jc_data[c]通过并对应于矩阵的static_jc_data[c+1]-1列。在该范围内 ( to ) 的条目为您提供矩阵中的值并为您提供正确的行。static_pr_datastatic_ir_datacstatic_jc_data[c]static_jc_data[c+1]-1static_pr_datastatic_ir_data

例如,这里的矩阵是:

A = [ 5.8  0
      0    5.9
      6.2  0
      0    6.1];

要回答有关如何单独访问元素的问题,您必须搜索i,jth 元素是否存在以及是否返回它,否则返回 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 的。这应该会增加乐趣。

于 2011-05-23T14:16:03.610 回答