2011-06-22 17 views
7

Escribo código para realizar algunas simulaciones de teoría de juegos. Mi "mundo" tiene varios estados (digamos 2 en mi caso), también tiene varios jugadores (nuevamente, 2), y cada jugador tiene una matriz de pagos (2 por 2).Matriz multidimensional vs. Lista de tuplas de lista

I intentado crear la siguiente matriz multi-dimensional en R:

U = array(2,2,2,2) 
U[1][1] = cbind(c(0.7,0.3),c(0.3,0.7)) 

y yo recibir el siguiente error:

number of items to replace is not a multiple of replacement length 

puedo mover a la utilización de una lista, en la que cada artículo ser una lista de dos elementos, A y B, donde A y B son matrices de 2x2. Sin embargo, creo que realizar operaciones en las listas se volverá lentamente molesto y la vectorización será difícil.

¿Hay alguna sugerencia sobre la implementación adecuada o una explicación de por qué el código anterior no funciona?

Actualización: Al parecer, la sintaxis correcta sería:

U[1,1, , ] = cbind(c(0.7,0.3),c(0.3,0.7)) 

Mi pregunta sigue en pie - que es mejor, vectores multidimensionales o lista de tuplas?

Gracias,

  • Ron

Respuesta

10

Este código puede no poder trabajar, y se debe, al menos, intentarlo por sí mismo:

array(2,2,2,2) ## results in unused argument error 

Creo que quieres una matriz 4D

U <- array(0, dim = c(2,2,2,2)) 

y luego asignar a una 2D parte de uso de la sintaxis

U[1,1,,] <- cbind(c(0.7,0.3),c(0.3,0.7)) 

Extracto R? El código U[1][1] puede ser entendida en términos de T que está siendo tratado como si fuera un vector sin "dim" atributo (sólo los números en una vector, sin estructura de dimensión). El primer [1] extrae el primer elemento, devolviendo un único vector de elemento y el segundo [1] extrae a su vez el primer elemento de ese vector de elemento único.

En términos de entender qué es U[1,1,,]: esta es una matriz 2D que es un subconjunto de la matriz 4D U, especificado al tomar la primera porción de la primera y la segunda dimensión, y cada porción de la tercera y cuarta dimensión.

El error que ve proviene del hecho de que está tratando de asignar una matriz 2D a un solo elemento de U, pero solo hay una ranura y la estructura y el tamaño del primer elemento son diferentes a la matriz que está intentando aplastarlo.

Las dimensiones singleton (primera y segunda) que tienen solo una porción del subconjunto extraído se eliminan (por defecto) del resultado.Esto se puede evitar mediante la especificación de:

U[1, 1, , , drop = FALSE] 

lo que daría una matriz 4D, pero una con dos dimensiones "degeneradas", es decir [1, 1, 2, 2], donde los dos primeros son tipo de redundante (pero el el sentido de eso realmente depende de tu propósito). Esta parte no es realmente relevante para la asignación de nuevos valores a un subconjunto de la matriz original, pero podría ayudar a su comprensión.

Si una matriz o una lista es mejor para usted depende de lo que le gustaría hacer, por lo que le recomendé que volviera a hacer su pregunta y que se centrara en esas necesidades.