在 MEX 中创建稀疏矩阵
如何在用 C 编写的 MEX 文件中创建二维稀疏矩阵。创建矩阵后如何像 C 中那样单独访问元素,比如 mat[i][j]
?
我厌倦了使用 mxCreateNumericArray
函数,但我不是无法访问元素并将其设置为稀疏矩阵。
请帮忙
How to create a 2d sparse matrix in a MEX-file written in C. After creating the matrix how to access the elements individually like in C , say mat[i][j]
?
I tired using mxCreateNumericArray
function but I wasn't able to access the elements and also make it as a sparse matrix.
Please help
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
查看 mxCreateSparse 上的此页面。 然后您将需要查看 < a href="http://www.mathworks.com/help/matlab/apiref/mxsetpr.html" rel="noreferrer">mxSetPr, mxSetIr 和 mxSetJc 和相应的“get”版本。
这是一个示例如何分配稀疏矩阵。我意识到这是一个旧链接,但据我所知,它没有改变。
基本上,它的工作原理是
ir
数据包含行索引。jr
数据包含ir
数组的索引列表。例如,在如何分配稀疏矩阵的链接中,代码:数组
static_jc_data
告诉您索引static_jc_data[c]
到static_jc_data[c+
对应于矩阵的static_pr_data
和static_ir_data
的1]-1c
列。在该范围内(static_jc_data[c]
到static_jc_data[c+1]-1
),static_pr_data
的条目为您提供矩阵中的值static_ir_data
为您提供正确的行。例如,这里的矩阵为:
要回答有关如何单独访问元素的问题,您必须搜索第 i,j 个元素是否存在,如果存在则返回该元素,否则返回 0为此,您需要从
static_ir_data[static_jc_data[j]]
到static_ir_data[static_jc_data[j+1]-1]
进行搜索,以查看您的我存在。如果是,则
static_pr_data
中的相应条目将包含您的条目。如果不存在,则返回 0。但是,通常在使用稀疏矩阵时,如果您要对矩阵进行大量搜索以查看某个元素是否存在,您可能需要考虑如何使用它。通常,执行您正在执行的任何操作时,最好只遍历一次非零元素,而不是搜索每个第 i,j 个条目。
哦,还有最后一件事。请记住,在 MEX 代码中,所有索引都是基于 0 的,但在 MATLAB 中它们都是基于 1 的。这应该会增加乐趣。
See this page on mxCreateSparse. Then you'll want to look at mxSetPr, mxSetIr and mxSetJc and the corresponding "get" versions.
Here's an example of how to allocate a sparse matrix. I realize this is an old link, but to the best of my knowledge, it hasn't changed.
Basically, how it works is that the
ir
data contains the row indices. Thejr
data contains a list of indices into their
array. For instance, in the link on how to allocate a sparse matrix, the code:the array
static_jc_data
tells you that indicesstatic_jc_data[c]
throughstatic_jc_data[c+1]-1
ofstatic_pr_data
andstatic_ir_data
correspond to the columnc
of the matrix. Within that range (static_jc_data[c]
tostatic_jc_data[c+1]-1
) the entries ofstatic_pr_data
gives you the values in the matrix andstatic_ir_data
gives you the correct rows.For example, the matrix here would be:
To answer your questions about how to access elements individually, you have to search for whether the
i,j
th element exists and if it does return it, otherwise return 0. To do this, you'd search fromstatic_ir_data[static_jc_data[j]]
throughstatic_ir_data[static_jc_data[j+1]-1]
to see whether youri
exists. If it does, then the corresponding entry instatic_pr_data
will contain your entry. If it doesn't, then return 0.However, typically with sparse matrix usage, if you're doing a lot of searching through the matrix to see if a certain element exists, you may want to think about how you're using it. Typically, it's much better to perform whatever operation you're doing by only going through the non-zero elements once instead of searching for each
i,j
th entry.Oh, and one last thing. Keep in mind that in the MEX code, all your indices are 0 based, but they are 1 based in MATLAB. That should add to the fun.