2016-07-20 11 views
2

Eigenの疎行列の対角を編集する最も速い方法は何ですか?私はすでにトリプレットを使ってそれを埋めましたが、時にはすべての対角値を変更する必要があります(既にゼロ以外に設定されています)。スパース行列の固有対角更新

答えて

2

許容できる場合は、各アクセスはバイナリ検索を必要とするとして、あなたは、単に

sp_mat(i, i) 

のように、それぞれのインデックスを使用することができ、パフォーマンスは満足できない場合があります。この場合でも、いくつかの制限事項でより良いパフォーマンスを達成することができます。

  1. マトリックスのレイアウトを変更することはありません。追加/削除nnzs、圧縮;
  2. 対角線に繰り返しアクセスします。

これらの制限を使用すると、後でO(1)時間後にデータにアクセスできるように対角コンポーネントのポインタを格納できます。あなたはkangshiyinの答えを完了するために

&sp_mat(i, i) 
+0

これはまさに私の条件です。それらの位置へのポインタにアクセスする方法を知っていますか? – cgreen

+0

@cgreen use '&' – kangshiyin

2

でポインタを得ることができる、あなたはまた、各対角要素に1を追加するたとえば、密ベクトル表現を通じて対角線を編集することができます:警告

sp_mat.diagonal().array() += 1; 

:対角要素がすでに存在する場合にのみ動作します。これは元の質問の場合です。

+0

私にとっては、要素はすでに存在します。ポインタを格納して直接変更するよりも速く/遅くなることを表現すると思いますか? – cgreen

+0

この方法では毎回バイナリ検索が行われますが、場合によっては書きやすくなります。 – ggael

+0

v3.2.9で.diagonal()を使用できますか? – kangshiyin

関連する問題