如何在用C编写的MEX文件中创建二维稀疏矩阵。创建矩阵之后如何像C一样单独访问元素,比如说mat[i][j]
?
我厌倦了使用mxCreateNumericArray
函数,但我无法访问这些元素并将其作为稀疏矩阵。
请帮忙
答案 0 :(得分:10)
See this page on mxCreateSparse.然后,您需要查看mxSetPr,mxSetIr和mxSetJc以及相应的“获取”版本。
Here's an example of how to allocate a sparse matrix.我意识到这是一个旧链接,但就我所知,它并没有改变。
基本上,how it works是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
元素是否存在以及是否确实返回,否则返回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。这应该会增加乐趣。