2010-02-09 20 views
8

Supongamos que tengo una lista de Matrices guarda en la variable G y aplicar las siguientes operaciones:¿Mathematica 7 es compatible con la evaluación diferida?

top[g_] = Minors[g] 
Diagonal[top /@ G] 

Minors devuelve una matriz donde cada elemento es el determinante con el (i, j) de fila/col eliminado, y Diagonal devuelve una lista de los elementos diagonales de una matriz.

Mi pregunta es sobre la evaluación de estos comandos: claramente no quiero que se evalúen todas las entradas. ¿Es Mathematica vago en el sentido de que Diagonal se analiza primero, que solo extrae los elementos necesarios de Menores o se construye la matriz menor y luego se extraen sus elementos diagonales?

Esta es una pregunta general para la evaluación perezosa, sin embargo, siendo nuevo en Mathematica, agradecería cualquier consejo sobre cómo mejorar la sintaxis para el problema específico.

+0

G es una matriz o una lista de matrices? ¿Te refieres a Map top sobre G? y luego tomar la Diagonal de una lista de matrices? – Davorak

Respuesta

3

Es tarde, solo una breve respuesta: investigue Hold[] y sus familiares. Con ellos puedes implementar funciones de evaluación perezosas. La mayoría de las funciones intrínsecas de Mathematica no son flojas, algunas lo son. En general, como principiante, debe evitar modificar el comportamiento de las funciones intrínsecas de Mathematica, aunque es muy divertido hacerlo y puede hacer que todo el sistema sea inutilizable.

+1

Cuando tenga la oportunidad, ¿podría editar su pregunta para dar un ejemplo (quizás el particular como se indica) ?. El sitio web de Mathematica, si bien está lleno de ejemplos, no pareció hacer nada práctico. – Hooked

1

Ninguna matemática no es floja en general.

top/@G 

Producirá una matriz en la que Diagonal operará. Dado que Minors no opera en elementos individuales de la matriz, lo que usted está pidiendo no es, por lo que yo sé, solo una evaluación perezosa.

Creo que tengo una solución para usted.

Clear[f]; 
Diagonal[Minors[G,Length[G],f]]/.f->Det 

Esta solución solo producirá los elementos menores de los elementos diagonales que se suman por diagonal. Pero solo he movido el exceso de cálculo a un problema de exceso de memoria. Debido a que la submatriz de los elementos fuera de diagonal todavía se produce solo para ser desechada. Voy a publicar nuevamente si pienso en una forma de prevenir eso también.

3

Puede resolver este problema mediante la creación de la lista de los menores diagonales por sí mismo y luego aplicar Det, para una matriz M:

Map[Det,Drop[Transpose[Drop[M,{#}]],{#}]& /@ Range[1,Dimensions[M][[1]]]] 

Esto es un poco de un cludge pero es aproximadamente 50 veces más rápido que utilizar Mathematica construido en Minors y seleccionar solo los elementos diagonales (probados en 100x100 matrices aleatorias).

+0

(+1) Para la solución práctica al problema en particular (¡gracias!). Estoy seleccionando una respuesta diferente ya que la pregunta era sobre la evaluación perezosa en Mathematica. – Hooked

+0

No hay problema :-). – Timo

Cuestiones relacionadas