2011-11-24 11 views
6

Sono interessato all'utilizzo di una funzione Compilabile elencabile su elenchi che non devono necessariamente essere tensori. Voglio capire perché alcune funzioni funzionano, mentre altri no e chiudono il kernel. Ecco un esempio.Utilizzo di una funzione compilabile elencabile su elenchi non tensoriali

Supponiamo di avere due matrici m1 e m2 come segue.

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}}; 

Possiamo creare due elenchi diversi, il primo è un tensore e il secondo 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 

Allo stesso modo, lasciare che V1 e V2 essere due vettori e vList1 e vList2 essere due liste come segue

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 

Ora definiamo due elencabile funzioni func1 e 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 
    ]; 

opere FUNC1 su entrambi gli elenchi del tensore e del non tensore come si può vedere sotto

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 lavora sul tensore elenca mList1 e vList1 e una costante reale come segue

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

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

La funzione è in grado di utilizzare l'unica vera 5.0, ripetutamente.

Tuttavia, la stessa funzione non funziona sugli elenchi non tensoriali mList2 e vList2. Quanto segue chiude il mio kernel (Mathematica 8.0.4, su Windows Vista).

func2[mList2, vList2, 5.0] 

È interessante notare che le seguenti opere.

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

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

Qualcuno può spiegare questo comportamento?

+4

Questo è un bug ed è stato corretto nella versione di sviluppo. Per ora devi usare la versione {5., 5.}. –

+0

@ruebenko: il bug sembra peggiorare con Parallelization-> True. – asim

+1

@ruebenko Vi incoraggio a postarlo come risposta, in modo che questa domanda non sembri essere senza risposta. –

risposta

3

Questo è un bug ed è stato corretto nella versione di sviluppo. Per ora devi usare la versione {5., 5.}.

Problemi correlati