【发布时间】:2013-12-13 16:25:08
【问题描述】:
如何在用 C 编写的 MEX 文件中创建 2d 稀疏矩阵。创建矩阵后,如何像在 C 中那样单独访问元素,比如 mat[i][j]?
我厌倦了使用 mxCreateNumericArray 函数,但我无法访问元素并将其设为稀疏矩阵。
请帮忙
【问题讨论】:
标签: c matlab sparse-matrix mex
如何在用 C 编写的 MEX 文件中创建 2d 稀疏矩阵。创建矩阵后,如何像在 C 中那样单独访问元素,比如 mat[i][j]?
我厌倦了使用 mxCreateNumericArray 函数,但我无法访问元素并将其设为稀疏矩阵。
请帮忙
【问题讨论】:
标签: c matlab sparse-matrix mex
See this page on mxCreateSparse. 然后您需要查看mxSetPr、mxSetIr 和mxSetJc 以及相应的“get”版本。
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_pr_data 和static_ir_data 的索引static_jc_data[c] 到static_jc_data[c+1]-1 对应于矩阵的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,jth 元素是否存在,如果确实返回,则返回 0。为此,您需要从 static_ir_data[static_jc_data[j]] 搜索通过static_ir_data[static_jc_data[j+1]-1]查看你的i是否存在。如果是这样,那么static_pr_data 中的相应条目将包含您的条目。如果不是,则返回 0。
但是,通常使用稀疏矩阵时,如果您在矩阵中进行大量搜索以查看某个元素是否存在,您可能需要考虑如何使用它。通常情况下,执行您正在执行的任何操作时,最好只遍历一次非零元素,而不是搜索每个 i,jth 条目。
哦,还有最后一件事。请记住,在 MEX 代码中,所有索引都是基于 0 的,但在 MATLAB 中它们是基于 1 的。这应该会增加乐趣。
【讨论】: