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 回答