2010-10-07 98 views
1

我试图在20x20矩阵中找到2位数字的最大对角乘积。R或R中的for循环 - 计算矩阵的对角乘积

这给出了一个错误信息:

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

http://www.philender.com/courses/multivariate/notes/matr.html和max() – 2010-10-07 17:55:39

+0

实际上,您的解决方案都不起作用。我编辑了您的条目以更好地反映您的问题。如果您不同意,请回滚。 – 2010-10-08 10:17:47

回答

6

这看起来不对。

您无法将for循环的结果赋值给变量。而max()是一个标量变量,这是无稽之谈。最后,未指定矩阵x。我会用更小的东西重试,甚至可能会打印一些临时结果。

走之前跑步还是很好的建议。稍后,您仍然可以为sprint解决方案进行矢量化。

+0

不会是一个向量,从哪个最大值可以给出最大值? – user446667 2010-10-07 18:02:18

+0

另外,为了获取数据,我使用了read.table(“filename”),所以我不确定它是否是矩阵形式或任何表格。 – user446667 2010-10-07 18:04:01

+0

好吧,这是一个数据帧 - 难以处理数据帧或矩阵? – user446667 2010-10-07 18:05:46

1

实际上,与德克相反,我相信你应该尽早知道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)轻松地将其转换为一个矩阵。