【问题标题】:in or out of a for loop in R - calculating the diagonal product of a matrix进出R中的for循环-计算矩阵的对角积
【发布时间】:2011-04-22 12:15:37
【问题描述】:

我试图在 20x20 矩阵中找到 2 位数字的最大对角积。

这会给出一条错误消息:

i <- 17:1
z <- for (j in 1:(18-i))
        {b <- max ((x[i,j]*x[i+1,j+1]*x[i+2,j+2]*x[i+3,j+3]))}}

但这不是:

z <- for (i <- 17:1)
{for (j in 1:(18-i))
        {b <- max ((x[i,j]*x[i+1,j+1]*x[i+2,j+2]*x[i+3,j+3]))}}

但是第二个版本给我的数字太小了。为什么第一个不起作用,我认为它会产生正确的答案,但我不明白错误消息。

【问题讨论】:

标签: r matrix for-loop


【解决方案1】:

实际上,与 Dirk 相反,我认为您应该尽快了解 R 中的矢量化。您尝试实现的循环结构远非最佳,实际上是多余的。只有在非常特殊的情况下才应该使用 for 循环。查看this question 中的讨论。查看diag()、combn()、prod()和apply()等便利函数的帮助文件。

很容易将它们组合起来做你想做的事:

x <-matrix(1:400,ncol=20)

Diag <- diag(x)

Id <- combn(1:length(Diag),2)

Diag.prod <- apply(matrix(Diag[Id],ncol=2),1,prod)

Max.Diag.prod <- max(Diag.prod)

编辑:您使用数据框,但您可以使用 as.matrix(x) 轻松将其转换为矩阵。

【讨论】:

    【解决方案2】:

    这看起来不对。

    您不能将for 循环的结果分配给变量。而max() 是一个无意义的标量变量。最后,未指定矩阵x。我会用更小的东西重试,甚至可能会在屏幕上打印一些中间结果。

    先走后跑仍然是个好建议。稍后您仍然可以矢量化以获取 sprint 解决方案。

    【讨论】:

    • 不会 b 是一个向量,从该向量中 max 会给出最大值吗?
    • 另外,为了获取数据,我使用了 read.table("filename") 所以我不确定它是矩阵形式还是表格。
    • 好的,它是一个数据框——使用数据框还是矩阵更难?
    • 我认为您的意思是您不能将 for 循环的结果分配给变量(无论如何,在最新版本的 R 中)
    • 谢谢,哈德利。总有一天我会学会校对。现已修复。
    猜你喜欢
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 2022-01-01
    • 2014-07-17
    相关资源
    最近更新 更多