我有一些这样的功能:
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)。 这是非常低效和非常耗时的 这些矩阵往往很大。
有没有一种聪明的方法可以解决这个问题?这会非常烦人 必须手动更改代码。
答案 0 :(得分:1)
首先,如果您的doX
函数期望矩阵的转置,那么您将在某处调用t
,例如
do1(t(x[indexfunc(),])))
所以你的选择是:
x
一次doX
来电转接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
}