C++ 列和行交换的最佳稀疏矩阵表示法

C++ 列和行交换的最佳稀疏矩阵表示法,c++,data-structures,matrix,sparse-matrix,C++,Data Structures,Matrix,Sparse Matrix,我正在寻找允许高效的行和列交换的稀疏矩阵表示。经典的表示法(通过压缩行、压缩列或三元组)似乎只允许执行一个或另一个,但从不允许。 有人知道这方面的好数据结构吗 --编辑-- 为了澄清这一点,我希望能够交换行,如交换行5和行7,以及交换列,如交换列6和列8。您可能只想添加另一个间接级别来处理交换,无论哪个级别效率不高。例如,如果您有一个可以有效交换行而不是列的稀疏表示,那么就有一个从真列映射到有效列的数组。访问元素时,请使用数组查找适当的底层元素 class SparseMatrix { pu

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

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

您可能只想添加另一个间接级别来处理交换,无论哪个级别效率不高。例如,如果您有一个可以有效交换行而不是列的稀疏表示,那么就有一个从真列映射到有效列的数组。访问元素时,请使用数组查找适当的底层元素

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;
};
类SparseMatrix{
公众:
元素和运算符()(索引行、索引列)
{
返回矩阵(行、列映射[col]);
}
无效船首(索引行1,索引行2)
{
矩阵。swapRows(第1行,第2行);
}
无效swapCols(索引col1、索引col2)
{
交换(col_-map[col1],col_-map[col2]);
}
私人:
FastRowSwapsparsemarix矩阵;
矢量坐标图;
};
我的建议是

本征:非常快速和有效的线性代数运算

boost-->中的映射矩阵更灵活,但对于线性代数运算速度较慢


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

您所说的“经典表示法”是什么意思?我知道大约六种存储稀疏矩阵的方法,每种都适合某些操作,每种都不适合某些操作。你说的“高效的行和列交换”是什么意思?例如,是否要将第1行与第3列交换;或者你想转换整个矩阵?@HighPerformanceMark:我认为它可以有效地将第1行与第5行交换,也可以有效地将第4列与第9列交换,但不能混合行和列。。。我猜这意味着这个问题真的很难回答:xi对这个问题做了一些澄清,我想在行之间和列之间交换,而不是混合启动。有些人可能会找到一个反例,但那些最适合列交换的表示通常不适合行交换,反之亦然。