2017-06-20 186 views
1

我有一个从0到n的值序列的向量,称为seq。我也有两个列输出,每个长度1000从以前运行的数学模型,col1col2R:计算矩阵的所有元素的值

col1 col2 0 1 2 3 4 ... n 
101 4  _ _ _ _ _ ... _ 
250 12  _ _ _ _ _ ... _ 
1007 8  _ _ _ _ _ ... _ 

我的矩阵中号将具有第一列作为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个元素。

它很简单,并且很容易对2和i进行循环。但它会运行1000行,对于seq的所有n + 1元素,所以我担心这可能会让我的搜索速度变慢,因为我的搜索引擎seq的搜索量很大。请问有更快的方法来计算M的所有元素吗?

+1

你不必做两个for循环。 R只做矢量操作就足够了。对于(j in 1:n)M [,j + 2] < - (M [,1] + seq [j])/ M [,2]'。你也可以使用'apply'功能。 –

回答

2

我建议:

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

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

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

+0

这是一个非常简单和优雅的解决方案。我要测试外部和补给函数的速度,但看到我的问题如何通过这样一个简单的解决方案可以解决,这真是太棒了。谢谢。 – tfmunkey

1

sapply函数示例。

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