2011-11-24 11 views
6

Jestem zainteresowany wykorzystaniem funkcji Listable Compiled na listach, które nie muszą być tensorami. Chcę zrozumieć, dlaczego niektóre funkcje działają, gdzie inni nie, i wyłączyć jądro. Oto przykład.Używanie skompilowanej listy funkcji na listach bez tensorów

Załóżmy, że mamy dwie macierze m1 i m2 w następujący sposób.

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

Możemy wykonać dwie różne listy, pierwsza to tensor, a druga nie.

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

In[4]:= TensorQ[mList1] 

Out[4]= True 

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

In[6]:= TensorQ[mList2] 

Out[6]= False 

Podobnie, niech v1 i v2 są dwa wektory i vList1 i vList2 być dwa wykazy następująco

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 

Teraz możemy zdefiniować dwa listable funkcje func1 i 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 
    ]; 

prace func1 na listach tensorów i bez tensorów, jak można zobaczyć poniżej:

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 działa na tensora wymienia mList1 i vList1 oraz rzeczywistą stałą następująco

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

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

funkcja jest w stanie za pomocą pojedynczego prawdziwe 5.0, wielokrotnie.

Jednak ta sama funkcja nie działa na listach nie tensorowych mList2 i vList2. Następujące polecenie zamyka moje jądro (Mathematica 8.0.4, w systemie Windows Vista).

func2[mList2, vList2, 5.0] 

Co ciekawe, następujące prace.

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

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

Czy ktoś może wyjaśnić to zachowanie?

+4

To jest błąd i został naprawiony w wersji rozwojowej. Na razie musisz użyć wersji {5., 5.}. –

+0

@ruebenko: Błąd wydaje się gorzej z Parallelization-> True. – asim

+1

@ruebenko Zachęcam do umieszczenia tego jako odpowiedzi, aby pytanie to nie pozostało bez odpowiedzi. –

Odpowiedz

3

To jest błąd i został naprawiony w wersji rozwojowej. Na razie musisz użyć wersji {5., 5.}.

Powiązane problemy