【问题标题】:Creating sparse matrix in MEX在 MEX 中创建稀疏矩阵
【发布时间】:2013-12-13 16:25:08
【问题描述】:

如何在用 C 编写的 MEX 文件中创建 2d 稀疏矩阵。创建矩阵后,如何像在 C 中那样单独访问元素,比如 mat[i][j]

我厌倦了使用 mxCreateNumericArray 函数,但我无法访问元素并将其设为稀疏矩阵。

请帮忙

【问题讨论】:

    标签: c matlab sparse-matrix mex


    【解决方案1】:

    See this page on mxCreateSparse. 然后您需要查看mxSetPrmxSetIrmxSetJc 以及相应的“get”版本。

    Here's an example of how to allocate a sparse matrix.我知道这是一个旧链接,但据我所知,它没有改变。

    基本上,how it worksir 数据包含行索引。 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_datastatic_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 的。这应该会增加乐趣。

    【讨论】:

    • 我理解了你的例子,但是我如何创建 jc 数组,我不理解那部分......问题是我必须制作一个二维矩阵,在其中我通过填充某些位置的值一些计算..说 w[1][2]= 一些公式..现在我是否必须创建一个包含所有非零元素的 prdata 数组?
    • jc 数组比列数多一。它是迄今为止列中非零元素数量的累积和。这样可以有效地确定给定列中的元素数量。
    • @pxu - 如果你仔细想想,这和我说的完全一致。
    • 是的。只是想给一个班轮来解决 rohit 的问题。我个人不喜欢在 mex 中使用 Matlab 稀疏矩阵。如果您担心性能,请使用 CSparse 和 std::map 之类的库对键进行排序。
    • +1 关于 MEX 中稀疏矩阵的精彩文章。我希望我可以多次投票...
    猜你喜欢
    • 1970-01-01
    • 2012-01-10
    • 2017-03-31
    • 2018-12-14
    • 2016-10-23
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多