进出R中的for循环 - 计算矩阵的对角积

时间:2010-10-07 17:47:48

标签: r matrix for-loop

我试图在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]))}}

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

2 个答案:

答案 0 :(得分:6)

这看起来不错。

您无法将for循环的结果分配给变量。并且max()超过标量变量,这是无意义的。最后,未指定矩阵x。我会用更小的东西重试,甚至可能会打印一些中间结果进行筛选。

在你跑步之前走仍然是个好建议。之后你仍然可以为sprint解决方案进行矢量化。

答案 1 :(得分: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)将其轻松转换为矩阵。