4

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

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

4

2 回答 2

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;
};
于 2012-04-25T13:48:48.843 回答
0

我的建议是

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

或者

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

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

于 2012-04-26T08:00:35.807 回答