如何在用 C 编写的 MEX 文件中创建 2d 稀疏矩阵。创建矩阵后,如何像在 C 中那样单独访问元素,比如说mat[i][j]
?
我厌倦了使用mxCreateNumericArray
函数,但我无法访问元素并将其设为稀疏矩阵。
请帮忙
如何在用 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+1]-1
列。在该范围内 ( to ) 的条目为您提供矩阵中的值并为您提供正确的行。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_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 的。这应该会增加乐趣。