在MEX中创建稀疏矩阵

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

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

请帮忙

请参阅mxCreateSparse上的此页面。 然后,您将要查看mxSetPr , mxSetIr和mxSetJc以及相应的“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]static_jc_data[c+1]-1对应于矩阵的列c 。 在该范围内( static_jc_data[c]static_jc_data[c+1]-1 ), static_jc_data[c+1]-1的条目为您提供矩阵中的值, static_ir_data为您提供正确的行。

例如,这里的矩阵将是:

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

要回答有关如何单独访问元素的问题,您必须搜索第i,ji,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个第i,j个条目来执行您正在执行的任何操作要好得多。

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