我试图在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]))}}
但是第二个版本给了我一个太小的数字。为什么第一个不起作用,我认为它会产生正确答案,但我不理解错误信息。
答案 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)
将其轻松转换为矩阵。