我有一个从0到n的值序列的向量,称为 seq 。我还有两个列输出,每个长度为1000,来自先前运行的数学模型, col1 和 col2 。
col1 col2 0 1 2 3 4 ... n
101 4 _ _ _ _ _ ... _
250 12 _ _ _ _ _ ... _
1007 8 _ _ _ _ _ ... _
我的矩阵 M 的第一列为 col1 ,第二列为 col2 。我创建了 M ,然后我有n + 1个空白列,每个 seq 元素一个。
M的其余元素将使用一个非常简单的公式填充:
M[i,j+2] = (M[i,1]+seq[j])/M[i,2]
即。对于 seq 的元素j,取第1列的第i个元素并将其添加到seq [j],然后除以第2列的第i个元素。
这很简单,在i和j上做2循环很容易。但它会运行1000行,并且对于 seq 的所有n + 1个元素,所以我担心这会让我对于冗长的 seq 非常放慢速度。有没有更快的方法来计算 M 的所有元素呢?
答案 0 :(得分:2)
我建议:
M[, 3 + 0:n] <- outer(M[,1], 0:n, "+") / M[, 2]
这是一个非常简单而优雅的解决方案。我将测试
outer
和sapply
函数的速度有多快,但看到如何通过这样一个简单的解决方案解决我的问题真是太棒了。谢谢。
outer
是一个矢量化解决方案,原则上是最快的。然而,矢量化是以内存成本为代价的。因为虽然您使用一个矩阵,但在计算过程中会产生3个额外的副本。如果你有一个非常大的矩阵(你的问题中的例子远远没有大,不用担心),会有一个RAM命中并且不可能比for
循环更快,在你的问题下评论,因为没有在循环期间制作矩阵的副本。
答案 1 :(得分:1)
sapply
功能的示例。
M[, 3 + 0:n] <- sapply(0:n, function(x) return((M[,1]+seq[x+1])/M[,2]))