私は現在、スパース行列を保存するためのstd ::マップを使用しています:私は私がやりたいのマトリックス(行列転置を*行列)を作成した後マップのイテレータを使用せずにキー値のペアにアクセスできますか?
std::map<std::pair<int, int>, double> matrix;
は私が
matrix[std::make_pair(i,j)] = value;
を行う挿入するには(00 * 00)+(10 * 10)+(20 * 20)(垂直列にアクセスする)...イテレータは(00)(01)(02)(アクセス水平列)からです。 ..私はstdイテレータを使用することはできません。 (00)*(00)+(10 * 10)+ ..私は、x1、y1、x2、y2を使って行列要素にアクセスするループを使用します。
だから私の質問は(私がやっていることが意味をなさない)イテレータを使わずにstd :: pairの最初と2番目のペアにアクセスするにはどうすればいいですか?
std::map<std::pair<int, int>, double> transpose(
std::map<std::pair<int, int>, double> const& in
) {
std::map<std::pair<int, int>, double> r;
for (auto&& e:in)
r[std::make_pair(e.first.second, e.first.first)] = e.second;
return r;
}
が、これは、ブランドの新しい行列を割り当てる必要があります。
マップ内の要素をトラバースしたい順序で格納するカスタムコンパレータを記述できますか? – NathanOliver
'std :: pair'の最初と2番目の値にアクセスするには、' first'と 'second'クラスのメンバーにアクセスします。 *肩をすくめる。あなたの質問は不明です。 –
この構造の転置繰り返しは、実際には効率的ではありません。要素が存在するかどうかを確認するために、各インデックスのペアを一度に検索する以外の方法はありません。そのため、多くの疎なマトリックス・フレームワークは列ごとのリストを保管しています。しかし、あなたの質問は、あなたの説明に従っていないようです。全体を反復することはできないので、必要な要素を調べなければなりません。それはペアの値にアクセスすることと何が関係していますか? – Peter