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 つの異なるリストを作成できます。1 つ目はテンソルで、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 と v2 を 2 つのベクトル、vList1 と vList2 を 2 つのリストとします。

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 は、以下に示すように、テンソル リストと非テンソル リストの両方で機能します。

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 は、次のように、テンソル リスト mList1 と vList1 および実定数に対して機能します。

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

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

この機能は、単一のリアル 5.0 を繰り返し使用することができます。

ただし、同じ関数は非テンソル リスト 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

1 に答える 1

3

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

于 2011-11-29T22:45:03.687 に答える