R:计算矩阵

时间:2017-06-20 16:15:35

标签: r for-loop matrix apply

我有一个从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 的所有元素呢?

2 个答案:

答案 0 :(得分:2)

我建议:

M[, 3 + 0:n] <- outer(M[,1], 0:n, "+") / M[, 2]
  

这是一个非常简单而优雅的解决方案。我将测试outersapply函数的速度有多快,但看到如何通过这样一个简单的解决方案解决我的问题真是太棒了。谢谢。

outer是一个矢量化解决方案,原则上是最快的。然而,矢量化是以内存成本为代价的。因为虽然您使用一个矩阵,但在计算过程中会产生3个额外的副本。如果你有一个非常大的矩阵(你的问题中的例子远远没有大,不用担心),会有一个RAM命中并且不可能比for循环更快,在你的问题下评论,因为没有在循环期间制作矩阵的副本。

答案 1 :(得分:1)

sapply功能的示例。

M[, 3 + 0:n] <- sapply(0:n, function(x) return((M[,1]+seq[x+1])/M[,2]))