0

私はこのようないくつかの機能を持っています:

myf = function(x) {
    # many similar statements involving indexing x
    do1(x[, indexfunc1()])
    do2(x[, indexfunc1()])
    do3(x[, indexfunc1()])
    do4(x[, indexfunc1()])
    do5(x[, indexfunc1()]) 
}

これらすべての関数で、x の列または行を抽出する必要があり、これらの関数はいくつかのループで使用されます。問題は、転置された形式のデータもある場合があることです。これは、これらのデータに対して t(x) を取得する必要があることを意味します。これらの行列はしばしば巨大であるため、これは非常に非効率的であり、非常に時間がかかります。

これに対処する賢い方法はありますか?コードを手動で変更しなければならないのは非常に面倒です。

4

1 に答える 1

1

まず第一に、doX関数が行列の転置を期待している場合t、たとえば、どこかで呼び出すことになります。

do1(t(x[indexfunc(),])))

したがって、オプションは次のとおりです。

  1. x先頭で一度移調
  2. doX呼び出しごとに転置
  3. doXオプションのisTranspose引数を取るように関数を書き直してください。

オプション 3 は最も手間がかかりますが、最も効率的でもあります。オプション 2 を使用するのが理にかなっている状況は、x巨大な場合ですが、毎回選択する行/列の数が少ない場合です。その場合、次のようなことができます:

matrixSelect<-function(x,subset,dim=1){
  if(dim==1)
      t(x[subset,])
  else
      x[,subset]
}

そして書く

myf = function(x,dim=2) {
    # many similar statements involving indexing x
    do1(matrixSelect(x,indexfunc1(),dim)
    # etc
}
于 2013-10-17T14:39:51.583 に答える