【问题标题】:Best sparse matrix representation for column and row swaping列和行交换的最佳稀疏矩阵表示
【发布时间】:2012-04-25 13:15:10
【问题描述】:

我正在寻找允许有效行和列交换的稀疏矩阵表示。经典表示(通过压缩行、压缩列或三元组)似乎只允许执行其中一个,但从不允许执行。 任何人都知道一个好的数据结构吗?

--编辑-- 为了澄清,我希望能够交换行,如交换第 5 行和第 7 行,以及交换列,如交换第 6 列和第 8 列。

【问题讨论】:

  • “经典表示”是什么意思?我知道存储稀疏矩阵的六种方法,每种方法都适合某些操作,每种方法都不适合某些操作。
  • “高效行列交换”是什么意思?例如,您想将第 1 行与第 3 列交换吗?还是要转置整个矩阵?
  • @HighPerformanceMark:我理解它能够有效地将第 1 行与第 5 行交换,并将第 4 列与第 9 列有效交换,但不能混合行和列...猜猜这意味着问题是真的很难得到:x
  • 我对问题进行了一些澄清,我想在行之间和列之间交换,而不是混合展位
  • 也许有人可以找到一个反例,但是那些最适合列交换的表示通常不适合行交换,反之亦然。

标签: c++ data-structures matrix sparse-matrix


【解决方案1】:

您可能只想添加另一个级别的间接来处理无效的交换。例如,如果您有一个可以有效交换行但不能交换列的稀疏表示,则有一个从真实列映射到有效列的数组。当您访问一个元素时,请使用该数组来查找正确的底层元素。

class SparseMatrix {
  public:
    Element& operator()(Index row,Index col)
    {
      return matrix(row,col_map[col]);
    }

    void swapRows(Index row1,Index row2)
    {
      matrix.swapRows(row1,row2);
    }

    void swapCols(Index col1,Index col2)
    {
      swap(col_map[col1],col_map[col2]);
    }

  private:
    FastRowSwapSparseMatrix matrix;
    vector<Index> col_map;
};

【讨论】:

    【解决方案2】:

    我的建议是

    Eigen:线性代数运算非常快速高效 http://eigen.tuxfamily.org/

    boost 中的映射矩阵 --> 更灵活,但线性代数运算更慢 http://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/matrix_sparse.htm

    对于您的情况,这两个库都允许您有效地操作行和列

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      相关资源
      最近更新 更多