効率的な行と列の交換を可能にする疎行列表現を探しています。古典的な表現 (圧縮された行、圧縮された列、またはトリプレットによる) では、どちらか一方しか実行できず、ブースは実行できないようです。これに適したデータ構造を知っている人はいますか?
-- 編集 -- 明確にするために、行 5 と行 7 を交換するように行を交換したり、列 6 と列 8 を交換するように列を交換したりしたいと考えています。
効率的な行と列の交換を可能にする疎行列表現を探しています。古典的な表現 (圧縮された行、圧縮された列、またはトリプレットによる) では、どちらか一方しか実行できず、ブースは実行できないようです。これに適したデータ構造を知っている人はいますか?
-- 編集 -- 明確にするために、行 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;
};
私の提案は
Eigen:線形代数演算に非常に高速で効率的 http://eigen.tuxfamily.org/
また
ブーストでマップされた行列->より柔軟ですが、線形代数演算では遅くなり ますhttp://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/matrix_sparse.htm
あなたの場合、両方のライブラリで行と列を効率的に操作できます