C 在MEX中创建稀疏矩阵
如何在用C编写的MEX文件中创建2d稀疏矩阵。创建矩阵后,如何像在C中一样单独访问元素,例如C 在MEX中创建稀疏矩阵,c,matlab,sparse-matrix,mex,C,Matlab,Sparse Matrix,Mex,如何在用C编写的MEX文件中创建2d稀疏矩阵。创建矩阵后,如何像在C中一样单独访问元素,例如mat[i][j] 我厌倦了使用函数,但我无法访问元素,也无法将其作为稀疏矩阵 请帮助然后您将要查看和相应的“获取”版本 我意识到这是一个古老的链接,但据我所知,它没有改变 基本上,ir数据包含行索引。jr数据包含ir数组中的索引列表。例如,在关于如何分配稀疏矩阵的链接中,代码: ... static double static_pr_data[NZMAX] = {5.8, 6.2, 5.9, 6.1}
mat[i][j]
我厌倦了使用函数,但我无法访问元素,也无法将其作为稀疏矩阵
请帮助然后您将要查看和相应的“获取”版本
我意识到这是一个古老的链接,但据我所知,它没有改变
基本上,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
的static_pr_data
和static_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
th元素是否存在,如果它确实返回它,否则返回0。为此,您可以从static\u ir\u data[static\u jc\u data[j]]
到static\u ir\u data[j+1]-1]
进行搜索,以查看您的i
是否存在。如果是,则静态\u pr\u数据
中的相应条目将包含您的条目。如果没有,则返回0
但是,通常在使用稀疏矩阵时,如果要在矩阵中进行大量搜索以查看某个元素是否存在,则可能需要考虑如何使用它。通常,执行您正在执行的任何操作时,最好只遍历非零元素一次,而不是搜索每个i,j
th条目
哦,还有最后一件事。请记住,在MEX代码中,所有索引都是基于0的,但在MATLAB中它们是基于1的。这应该会增加乐趣。我理解你的例子,但我不知道如何创建jc数组。问题是我必须制作一个2d矩阵,通过一些计算在其中填充某些位置的值。比如w[1][2]=一些公式。。现在我必须创建一个包含所有非零元素的prdata数组吗?Jc数组比列数多一个。它是迄今为止列中非零元素数量的累积和。这使我们能够有效地确定给定列中元素的数量。@pxu-如果您仔细考虑,这与我所说的完全一致。它是。只是想用一句话来回答rohit的问题。我个人不喜欢在mex中使用Matlab稀疏矩阵。如果您关心性能,请使用CSparse和std::map之类的库对键进行排序。+1在MEX中的稀疏矩阵上写得很好。我希望我能不止一次投票。。。