2012-01-07 1 views
1

多くのメモリを使わずに疎な行列を保存する方法はかなりあります。 しかし、私はそれの建設中に疎の行列を格納するための良い方法があるのだろうか?より詳細なシナリオは次のとおりです。プログラムは、各反復でゼロ以外の値をどこに置くべきかを計算してスパース行列を作成します。また、ゼロ以外の値の座標は実行時まで認識されないため、完全にランダムであり、予測できません。エレメントの充填処理中にスパース行列を経済的に保存するにはどうすればよいですか?

私はC++でプログラミングしています。 C++でこれを実装する方法はありますか?他の言語のソリューションも高く評価されています。

答えて

1

std :: mapはあなたが探しているものかもしれませんが、キー - >値マップタイプです。これを要素の一意の集合であるstd :: setと組み合わせてください。だから、あなたはそうのように、STDのマップ::セットを使用することができます。

std::map<int, std::set<int> > sparseMatrix; 

// Add some edges. 
sparseMatrix[0].insert(1); // Add an edge from vertex 0 to 1. 
sparseMatrix[4].insert(2); // Add an edge from vertex 4 to 2. 
sparseMatrix[0].insert(1); // Edge already exists, no data added to the set. 

この表現は、それがエッジリストに類似だ、あなたは有向グラフを表すことができます。セットの振る舞いによって、「同一」(a-> bおよびc-> d、a = bおよびc = dの2つのエッジ)ができなくなります。隣接行列を使用しました。コラム、あなたが1で3並列リストや店舗の行IDを持つことができ

2

for(std::map<int, std::set<int> >::const_iterator i = sparseMatrix.begin(); 
    i != sparseMatrix.end(); 
    ++i) 
{ 
    for(std::set<int>::const_iterator j = i->second.begin(); 
     j != i->second.end(); 
     ++j) 
    { 
     std::cout << "An edge exists from " << i->first << " to " << *j << "."; 
    } 
} 

いくつかのリンク:あなたはそうのようなエッジアルを繰り返すことができますもう一方のidは3番目の値です。すべての入力が完了したら、必要に応じて再編成することができます。行と列で並べ替えます。

あなたの質問には記載されていないものは、最終的にスパース行列をどのように表現する必要がありますか?あなたはそれと何をする必要がありますか?これは表示に影響します

関連する問題