我有一个R x C矩阵填充到第k行并且在此行下面是空的。我需要做的是填充剩余的行。为了做到这一点,我有一个函数,它将2个完整的行作为参数,处理这些行并输出2个新行(这些输出将填充矩阵的空行,分批为2)。我有一个包含行的所有“对”待处理的固定矩阵,但我的for循环是没有帮助的性能:R中的向量化矩阵运算
# the processRows function:
processRows = function(r1, r2)
{
# just change a little bit the two rows and return it in a compact way
nr1 = r1 * 0.1
nr2 = -r2 * 0.1
matrix (c(nr1, nr2), ncol = 2)
}
# M is the matrix
# nrow(M) and k are even, so nLeft is even
M = matrix(1:48, ncol = 3)
# half to fill (can be more or less, but k is always even)
k = nrow(M)/2
# simulate empty rows to be filled
M[-(1:k), ] = 0
cat('before fill')
print(M)
# number of empty rows to fill
nLeft = nrow(M) - k
nextRow = k + 1
# each row in idxList represents a 'pair' of rows to be processed
# any pairwise combination of non-empty rows could happen
# make it reproducible
set.seed(1)
idxList = matrix (sample(1:k, k), ncol = 2, byrow = TRUE)
for (i in 1 : (nLeft/2))
{
row1 = M[idxList[i, 1],]
row2 = M[idxList[i, 2],]
# the two columns in 'results' will become 2 rows in M
results = processRows(row1, row2)
# fill the matrix
M[nextRow, ] = results[, 1]
nextRow = nextRow + 1
M[nextRow, ] = results[, 2]
nextRow = nextRow + 1
}
cat('after fill')
print(M)
如果你把你会得到更好的解答您的问题[重复性(http://stackoverflow.com/questions/5963269/how-to - 制作 - 一个伟大-R重现-例子)。如果'processRows()'真的涉及到或者与这个问题不完全相关,那么简化这一点,给我们一些我们可以使用的东西。 – Chase 2012-07-09 01:55:37
也可以通过'complier'软件包查看一些免费的速度建议,或者通过'Rcpp'进行更多的介入[这个最近的问题](http://stackoverflow.com/questions/11377677/r-vectorised-conditional-replace/11379749)包 – Chase 2012-07-09 02:02:30
制作所有行对的两个长向量是相对简单的。真正的问题是'processRows()'在做什么?你在循环中进行的赋值操作相对来说是微不足道的(在像这样的实例中,使用'compiler'包可能几乎没有任何好处)。 ** if **'processRows()'可以一次传输所有数据,你可能会获得显着的性能提升,但这可能是瓶颈(以及你所告诉我们的一切)。你可以通过'M [nextRow:(nextRow + 1),] < - t(results)'获得一个小小的增益来代替你在两个任务中做的事情 – Joshua 2012-07-09 02:13:59