2013-02-22 21 views
5

私は現在、実際にループを持っています。実際にはループ内にループがあります。私はそのほとんどをベクトル化して、それをずっと速く作りました。しかし、私は私が達成したいだけのタスクに大きなループを簡素化し、同じものとして、リストの複数の要素を割り当てる部分があります:、上記の行が呼び出され、ループの各反復でRは複数のリスト要素を同じオブジェクトに割り当てます

new.matrices[[length(new.matrices)+1]]<-old.matrix 

をし、同じ行列オブジェクトがリストの次の新しい要素に割り当てられます。

可能であれば、これをベクトル化しようとしています。ループまたは適用ステートメントよりも高速にしています。

Warning message: 
In new.effectors[effectorlength] <- matrix : 
    number of items to replace is not a multiple of replacement length 

またold.matrix要素1への一つの値を代入しようとします:

indices <- seq(from = length(new.matrices) + 1, to = length(new.matrices) + reps) 
new.matrices[indices] <- old.matrix 

しかし、これはメッセージで結果:

これまでのところ、私はの線に沿ってのものを試してみましたnew.matricesのように:

[[1]] 
[1] 8687 

[[2]] 
[1] 1 

[[3]] 
[1] 5486 

[[4]] 
[1] 0 

希望の結果が1つのリストeleme nt = 1つの行列全体、old.matrixのコピー

リスト要素の行列をループせずにベクトル化する方法はありますか?現在どのようにループが実装されているのかは、何千もの反復を話しています。これはかなり遅くなるため、可能ならばベクトル化したいという私の望みです。

+6

new.matrices [indices] < - rep(list(old.matrix)、length(indices)) ' – hadley

+1

私は、作成しようとしているもののストレージオブジェクトを構築するためのより良い方法があると確信しています。後でいくつかの計算された行列でそれぞれのnew.matrices [[k]]を置き換えるつもりですか? (同じデータのN個のコピーを保存するのは意味がないようです)そうであれば、各リストエントリをあらかじめ作成する必要はありません。次の質問:リストが本当に必要なのか、それとも3番目のランク配列 'allmatrices [i、j、k]'、各層が 'oldmatrix'で十分ですか? –

+0

行列は2行で、nはcolであり、個体が持つ遺伝子に関する情報を格納します。ここで起こっているのは、胞子による無性生殖です。列の数は遺伝子の数に依存する - 遺伝子は複製または削除することができます。 'new.matrices'はそれぞれ、さまざまな変異プロセスのために変更されます。したがって、old.matrix [20]の場合、20の子孫を作成し、new.matrixに20回入れてから、突然変異プロセスを実行する関数の対象となります。このリストはまた、結果目的のためにシム・サイクルごとに結果リストにコピーされます。 – Ward9250

答えて

1

は、おそらくあなたはすでにあなたの問題を解決し、とにかく、あなたのコードで問題

new.matrices[indices] <- old.matrix 

は何か違う、matrixでいくつかのオブジェクト(ごnew.matricesリストでNULL要素)を交換するために試みることによって引き起こされました。だからRはベクトルにold.matrixを強制し、それぞれの値を別のリスト要素に張り付けようとします(そのため、結果はrepsは4または8、old.matrixは2 x 2行列ではありません。 warningを取得してください)。

new.matrices[indices] <- list(old.matrix) 

を行うと動作します、とRは自動的に単一要素リストにlist(old.matrix)reps」回を複製します。

関連する問題