2016-10-19 7 views
0

巨大対角行列を仮定します。これを実装する効率的な方法は何ですか?対称対角行列の表現

私が考えることができる唯一の方法は、Xij = Xjiの対称プロパティを使うことによって、この行列のサイズを半分に減らすことができるということです。しかし、2D配列を使ってこの行列を表現することは、配列を使って行列のサイズを減らすことができないため、非効率です。

隣接関係リストを使用してこの行列を表す別のことは、この行列をグラフに関連付けるため、非効率的です。これは濃度グラフです。また、adjリストの操作には、削除、挿入、検索など多くの時間がかかります。

しかし、ヒープの使用はどうですか?

+0

ギザギザの列とインデックスを使用してミラーリングを処理する1Dアレイを試してください。 – user4581301

+0

はい、良い選択です。あなたが考えることができる他の方法はありますか? –

+0

何か良い情報を与えるための情報が不十分です、私は恐れています。あなたの意図された使用パターンを知る必要がありますが、適度に複雑なインデックス作成の計算でも1Dアレイでは多くのスイートスポットが必要です。 – user4581301

答えて

3

この行列(または多分行列)を使って何をしようと決めるまで、答えはありません。

これを保存して覚えている場合は、冗長エントリを残して順番に保存してください。 (あなたのコードはそれにアクセスする方法を知っています、それはそうしているからです)

おそらく、あなたはそれに対して通常の行列操作をしたいと思うでしょう。その場合、ストレージを効率的にするか、実行していますか?後者の場合、私はそれが対称的であることに基づいて多くの機会を見ません - 倍増は高価なものであり、おそらくそれらのすべてがまだ必要です。それがストレージの場合は、対称的で対称的な操作に限定していますか?非常に具体的に聞こえる。そうであれば、定義すると他のエントリは対称であるため、格納する部分の計算を行うだけで済みます。そのため、行列のその部分を生成するコードを書いてください。

+0

効率的なストレージと効率的な実行のバランスをとる必要があることは時々分​​かります。それを扱う行列は、点間の距離、すなわち余弦距離などの距離距離を保持する。私が大規模なデータセットを扱っているので、私はストレージと実行のバランスをとる効率的なデータ構造を見つける必要があります。 –

+0

通常、0-50%の範囲で保存すると、あまりにも興奮しない(実際の支払いである90-99.9%の節約です)。しかし、それがあなたのシステムを実現可能にするならば、私はそれが各行列の形を知るようにすべてのコードを書く価値があると言いたい - とにかく行列の任意の場所に意味を与えるのは操作コードだけです。 –