2010-10-07 3 views
1

J'essaie de trouver le produit diagonal maximum de nombres à 2 chiffres dans une matrice 20x20.dans ou en dehors d'une boucle for en R - calculer le produit en diagonale d'une matrice

Cela donne un message d'erreur:

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]))}} 

Mais cela ne:

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]))}} 

mais la deuxième version me donne un trop petit nombre. Pourquoi le premier ne fonctionne pas, je pense que cela donnerait la bonne réponse, mais je ne comprends pas le message d'erreur.

+0

http://www.philender.com/courses/multivariate/notes/matr.html et max() –

+0

En fait, aucune de vos solutions ne fonctionne. J'ai modifié votre entrée pour mieux refléter votre question. Si vous n'êtes pas d'accord, il suffit de revenir en arrière. –

Répondre

6

Cela semble incorrect.

Vous ne pouvez pas affecter le résultat d'une boucle for à une variable. Et max() est sur une variable scalaire qui est un non-sens. Enfin, la matrice x n'est pas spécifiée. Je réessayerais avec quelque chose de plus petit, et peut-être même imprimer quelques résultats provisoires à l'écran.

Marcher avant de courir est toujours un bon conseil. Plus tard, vous pouvez toujours vectoriser pour une solution de sprint.

+0

ne serait pas un vecteur à partir duquel max donnerait la valeur maximale? – user446667

+0

De plus, pour obtenir les données, j'ai utilisé read.table ("nomfichier") donc je ne suis pas exactement sûr si c'est sous forme de matrice ou quoi que ce soit une table. – user446667

+0

ok, c'est un cadre de données - est-il plus difficile de travailler avec des trames de données ou des matrices? – user446667

1

En fait, contrairement à Dirk, je crois que vous devriez être au courant de la vectorisation dans R dès que possible. La structure de boucle que vous essayez de mettre en œuvre est loin d'être optimale et en fait redondante. L'utilisation d'une boucle for-devrait être faite seulement dans des cas très spécifiques. Vérifiez la discusison au this question. Jetez un oeil aux fichiers d'aide des fonctions de commodité comme diag(), combn(), prod() et apply().

Il est facile de les combiner pour faire ce que vous voulez:

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) 

Edit: Vous utilisez une trame de données, mais vous pouvez utiliser as.matrix(x) pour convertir facilement ce à une matrice.

Questions connexes