2017-06-20 40 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]))