在MEX中创建稀疏矩阵

时间:2011-05-23 09:51:38

标签: c matlab sparse-matrix mex

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

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

请帮忙

1 个答案:

答案 0 :(得分:10)

See this page on mxCreateSparse.然后,您需要查看mxSetPrmxSetIrmxSetJc以及相应的“获取”版本。

Here's an example of how to allocate a sparse matrix.我意识到这是一个旧链接,但就我所知,它并没有改变。

基本上,how it worksir数据包含行索引。 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的索引static_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];

要回答有关如何单独访问元素的问题,您必须搜索i,j元素是否存在以及是否确实返回,否则返回0.为此,您需要搜索{ {1}}通过static_ir_data[static_jc_data[j]]查看您的static_ir_data[static_jc_data[j+1]-1]是否存在。如果是,则i中的相应条目将包含您的条目。如果没有,则返回0.

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

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