2017-01-15 4 views
1

私はしばらくRを使用していましたが、パフォーマンスのために自分のコードを最適化するのは得策ではありません。そのi番目の行は、すべてj = 1, 2, ..., tため$ 1_ {Y_I < Y_j} $に対応するように長さtのベクトルY、与えられRのゼロと1の大きな行列を素早く効率的に計算する方法

、Iは、順tの正方行列を生成しようとしています。これは0/1の2進行列です。

しかし、私はこれを実行する最も効率的な方法ではないと主に考えています。主にオブジェクトのサイズを見ています。これは、密な行列と同じサイズです(バイト単位)。私の目標はこれを大きなtに拡張することですが、計算速度とそのようなマトリックスのストレージスペースは長すぎると考えています。この行列を保存して計算するためのより迅速かつ効率的な方法がありますか?

ありがとうございます!

+0

コードに 't'を定義していないので、' t'が転置関数であるためコードが機能しません。 –

+0

forループは非常に速いはずですが、上三角または下三角を計算するだけでスピードアップできます:計算/保存の約半分です。 – user20650

答えて

3

私が正しくあなたを理解している場合は、我々は使用することができます。

outer(t, t, "<=") + 0L 
## operator `"<="` returns TRUE/FALSE logical, 
## add an integer 0 to make a 0/1 binary integer matrix 

はのは、あなたの参照forループと比較して、簡単なテストを持ってみましょう。

set.seed(0); t <- runif(5) ## reproducible data 

outer(t, t, "<=") + 0L 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 1 0 0 0 1 
#[2,] 1 1 1 1 1 
#[3,] 1 0 1 1 1 
#[4,] 1 0 0 1 1 
#[5,] 0 0 0 0 1 

Y <- matrix(0, nrow=length(t), ncol=length(t)) 
for(i in 1:length(t)) { 
    Y[i, ] <- t[i] <= t 
} 

Y 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 1 0 0 0 1 
#[2,] 1 1 1 1 1 
#[3,] 1 0 1 1 1 
#[4,] 1 0 0 1 1 
#[5,] 0 0 0 0 1 

同じ結果が得られます。ビンゴ!!


注:

人々はこの回答の編集の歴史を読みました。 sparseMatrixの方法が示されている。私は当初、疎な行列を使うと考えていました。そして、カラムピボットは効率を改善するでしょうが、そうではありません。ベンチマークでは、outerは6倍以上高速です。したがって、私はかなり悲しいと感じていますが、私はそれらの大きなチャンクを私の答えの中に入れなければなりません。

+0

私はそうは思わない*疎な行列を使うと、行列が実際には疎でない場合には記憶領域が節約される - – user20650

+0

申し訳ありませんが、私は理解していますか?列の旋回を行うと、三角形の行列になります。 (ただし、半分のスパース行列が非ゼロの場合は、完全な行列よりも保存する方が効率が悪いと思われます) – user20650

+0

スパース行列を再計算します。半分がゼロの場合は、オブジェクトのサイズが半分であるサイズ。 'object.size(f(t、FALSE));を試してください。 object.size(f(t、TRUE)) 'です。また、私が外側で見つけた問題は、ベクトルがループの長さよりも長くなるので、メモリの問題に遭遇する可能性があるということです。 – user20650

関連する問題