2011-11-24 25 views
6

我有興趣在不需要張量的列表上使用Listable編譯函數。我想了解爲什麼某些功能可以工作,而其他功能則不能,關閉內核。這是一個例子。在非張量列表上使用編譯列表函數

假設我們有兩個矩陣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}}; 

我們可以做兩個不同的列表,第一個是張量,第二個不是。

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是兩個向量和vList1和vList2是兩個列表如下

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 

現在我們定義了兩個可列函數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。以下關閉我的內核(Mathematica 8.0.4,在Windows Vista上)。

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。}版本。 – 2011-11-24 20:56:27

+0

@ruebenko:這個錯誤似乎在並行化 - >真的情況下變得更糟。 – asim

+1

@ruebenko我鼓勵你發佈這個答案,以便這個問題看起來沒有被回答。 –

回答

3

這是一個錯誤,已在開發版本中修復。現在你必須使用{5.,5。}版本。