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?
Este es un error y se ha corregido en la versión de desarrollo. Por ahora debes usar la versión {5., 5.}. –
@ruebenko: El error parece empeorar con Parallelization-> True. – asim
@ruebenko Lo animo a que lo publique como respuesta, para que esta pregunta no parezca no tener respuesta. –