テンソルである必要のないリストに対して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}}
誰でもこの現象を説明できますか?
これはバグで、開発版で修正されています。今のところ、{5.、5.。}バージョンを使用する必要があります。 –
@ruebenko:Parallelization-> Trueでバグが悪化するようです。 – asim
@ruebenkoこの質問に回答がないように、回答として投稿することをお勧めします。 –