2011-11-24 18 views
6

Estoy interesado en utilizar una función Listable compilada en listas que no necesitan ser tensores. Quiero entender por qué algunas funciones funcionan, mientras que otras no y apagan el kernel. Aquí hay un ejemplo.Uso de una función compilada listable en listas sin tensores

Supongamos que tenemos dos matrices m1 y m2 de la siguiente manera.

m1 = {{1.0, 0.5, 0.5}, {0.5, 1.0, 0.5}, {0.5, 0.5, 1.0}}; 

m2 = {{1.0, 0.5}, {0.5, 1.0}}; 

Podemos hacer dos listas diferentes, la primera es un tensor y la segunda no.

In[3]:= mList1 = {m1, m1}; 

In[4]:= TensorQ[mList1] 

Out[4]= True 

In[5]:= mList2 = {m1, m2}; 

In[6]:= TensorQ[mList2] 

Out[6]= False 

Del mismo modo, dejar que V1 y V2 haber dos vectores y vList1 y vList2 dos listas de la siguiente manera

v1 = {1.0, 1.5, 0.9}; 

v2 = {1.1, 0.7}; 

In[9]:= vList1 = {v1, v1}; 

In[10]:= TensorQ[vList1] 

Out[10]= True 

In[11]:= vList2 = {v1, v2}; 

In[12]:= TensorQ[vList2] 

Out[12]= False 

Ahora se definen dos funciones susceptible de listarse func1 y FUNC2

func1 = Compile[{{m, _Real, 2}, {v, _Real, 1}}, 
    m.v, 
    RuntimeAttributes -> Listable 
    ]; 

func2 = Compile[{{m, _Real, 2}, {v, _Real, 1}, {r, _Real}}, 
    r*(m.v), 
    RuntimeAttributes -> Listable 
    ]; 

obras Func1 en las listas de tensores y no tensores como se puede ver a continuación

In[15]:= func1[mList1, vList1] 

Out[15]= {{2.2, 2.45, 2.15}, {2.2, 2.45, 2.15}} 

In[16]:= func1[mList2, vList2] 

Out[16]= {{2.2, 2.45, 2.15}, {1.45, 1.25}} 

func2 trabaja en el tensor enumera mList1 y vList1 y una constante real como sigue

In[17]:= func2[mList1, vList1, 5.0] 

Out[17]= {{11., 12.25, 10.75}, {11., 12.25, 10.75}} 

La función es capaz de usar la única verdadera 5.0, repetidamente.

Sin embargo, la misma función no funciona en las listas sin tensoriales mList2 y vList2. Lo siguiente apaga mi kernel (Mathematica 8.0.4, en Windows Vista).

func2[mList2, vList2, 5.0] 

De manera interesante, el siguiente funciona.

In[18]:= func2[mList2, vList2, {5.0, 5.0}] 

Out[18]= {{11., 12.25, 10.75}, {7.25, 6.25}} 

¿Alguien puede explicar este comportamiento?

+4

Este es un error y se ha corregido en la versión de desarrollo. Por ahora debes usar la versión {5., 5.}. –

+0

@ruebenko: El error parece empeorar con Parallelization-> True. – asim

+1

@ruebenko Lo animo a que lo publique como respuesta, para que esta pregunta no parezca no tener respuesta. –

Respuesta

3

Este es un error y se ha corregido en la versión de desarrollo. Por ahora debes usar la versión {5., 5.}.

Cuestiones relacionadas