2011-11-24 1 views
6

テンソルである必要のないリストに対してListable Compiled関数を使用することに興味があります。いくつかの関数が動作する理由、他の関数がカーネルをシャットダウンしないようにする理由を理解したい。ここに例があります。非テンソルリストでコンパイルされたリスト可能関数を使用する

次のように2つの行列m1とm2があるとします。

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

2つの異なるリストを作ることができます。最初のものはテンソルであり、2番目のものはありません。

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

In[4]:= TensorQ[mList1] 

Out[4]= True 

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

In[6]:= TensorQ[mList2] 

Out[6]= False 

同様に、V1聞かせ

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 

は、今では2リスト可能関数func1のと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 
    ]; 

func1の作品を定義し、次のように二つのベクトルとvList1とvList2なる二つのリストもv2の以下に示すように、テンソルおよび非テンソルの両方のリストにある。

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}} 
関数を繰り返し、単一の実5.0を使用することが可能である

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

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

を次のようにテンソルで動作する関数func

はmList1とvList1と実定数を示しています。

ただし、非テンソルリストmList2とvList2では同じ機能は動作しません。以下はカーネルをシャットダウンします(Windows VistaのMathematica 8.0.4)。

func2[mList2, vList2, 5.0] 

興味深いことに、以下の作品が興味深い。

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

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

誰でもこの現象を説明できますか?

+4

これはバグで、開発版で修正されています。今のところ、{5.、5.。}バージョンを使用する必要があります。 –

+0

@ruebenko:Parallelization-> Trueでバグが悪化するようです。 – asim

+1

@ruebenkoこの質問に回答がないように、回答として投稿することをお勧めします。 –

答えて

3

これはバグで、開発版で修正されています。今のところ、{5.、5.。}バージョンを使用する必要があります。

関連する問題