【问题标题】:R: Calculating values for all elements of an matrixR:计算矩阵所有元素的值
【发布时间】:2017-06-20 16:15:34
【问题描述】:

我有一个从 0 到 n 的值序列的向量,称为 seq。我还有两列输出,每列输出长度为 1000,来自先前运行的数学模型,col1col2

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 个 for 循环。但它会运行 1000 行和 seq 的所有 n+1 个元素,所以我担心这会在冗长的 seq 中大大减慢我的速度。请问有没有更快的方法来计算 M 的所有元素?

【问题讨论】:

  • 你不必做两个 for 循环。一个就足够了,就像 R 做向量运算一样。 for(j in 1:n) M[,j+2] <- (M[,1]+seq[j])/M[,2]。你也可以使用apply函数。

标签: r for-loop matrix apply


【解决方案1】:

我建议:

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

这是一个非常简单而优雅的解决方案。我将测试outersapply 函数的速度有多快,但是很高兴看到我的问题可以通过这样一个简单的解决方案来解决。谢谢。

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

【讨论】:

  • 这是一个非常简单优雅的解决方案。我将测试外部函数和 sapply 函数的速度,但很高兴看到我的问题可以通过如此简单的解决方案解决。谢谢。
【解决方案2】:

sapply 函数的示例。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2019-01-21
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多