【问题标题】:Sorting in C++ of a sparse matrix in COO format在 C++ 中对 COO 格式的稀疏矩阵进行排序
【发布时间】:2022-11-21 19:21:07
【问题描述】:

我在程序中使用 COO 格式的稀疏矩阵。 COO 格式使用 3 个独立的向量来表示矩阵:rowindex、colindex 和 values。我需要先按 rowindex 对矩阵进行排序,然后再按 colindex 对矩阵进行排序。例如,如果向量包含:

rowindex = [1 2 2 1 0 2 0 1 0 2 1 2]
colindex   = [7 7 2 1 3 9 8 6 6 0 3 4]
values      = [0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2]

(意味着矩阵中的元素 [1,7] 的值为 0.1,元素 [2,7] 的值为 0.2,元素 [2,2] 的值为 0.3,等等)排序后的矩阵应该是:

rowindex = [0 0 0   1 1 1 1   2 2 2 2 2]
colindex  = [3 6 8   1 3 6 7   0 2 4 7 9] 
values     = [0.5 0.9 0.7 0.4 1.1 0.8 0.1 1.0 0.3 1.2 0.2 0.6]

我在期望的结果中留了一些空间,以(希望)更好地展示我想要实现的目标。

这可以以某种方式实现吗:

  • 在 C++ 中使用可用的排序函数
  • 没有使用额外的内存(例如额外的向量),因为我使用的稀疏矩阵很大并且几乎占用了所有内存
  • 无需求助于将矩阵表示为结构数组(我知道可以在其中使用 sort() 函数)。

我发现了一些关于对多个向量进行排序的答案,只对其中一个向量的值进行排序。他们不需要根据第二个向量对第一个向量中具有相同值的元素进行排序。

【问题讨论】:

    标签: c++ sorting vector


    【解决方案1】:

    通常可以对 COO 中给出的稀疏矩阵进行排序。但不受您的限制。

    • 在 C++ 中使用可用的排序函数:基本上不可能,因为来自 std::libraries 的现有排序函数只能在一个范围内工作。即使将另一个 vectors 放在谓词闭包中并提出一些复杂的 lambda 函数,或者将所有内容都放在 Functor 中,这也是没有意义的。

    • 将需要额外的空间,使解决方案可行且易于解决。

    • 与约束 3 相同。

    所以,你需要做出妥协。或者使用非标准 C++ 库。

    【讨论】:

    • 亲爱的 Armin,感谢您调查此事。我也找不到具有上述限制的解决方案,所以我想问一下。所以,让我们开始放宽限制。如果我们使用非标准 C++ 库,您有什么建议/解决方案吗?在我的情况下,使用尽可能少的额外内存仍然是一个很大的优势。
    猜你喜欢
    • 1970-01-01
    • 2016-10-29
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2016-03-14
    • 2017-12-04
    • 2012-01-10
    相关资源
    最近更新 更多