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?
To jest błąd i został naprawiony w wersji rozwojowej. Na razie musisz użyć wersji {5., 5.}. –
@ruebenko: Błąd wydaje się gorzej z Parallelization-> True. – asim
@ruebenko Zachęcam do umieszczenia tego jako odpowiedzi, aby pytanie to nie pozostało bez odpowiedzi. –