2011-11-24 25 views
6

Tôi quan tâm đến việc sử dụng chức năng Danh sách được biên dịch trên danh sách không cần phải là tensors. Tôi muốn hiểu lý do tại sao một số chức năng hoạt động, trong khi những người khác không làm việc và tắt nhân. Đây là một ví dụ.Sử dụng chức năng có thể liệt kê được biên dịch trên danh sách không có hàng chục

Giả sử chúng ta có hai ma trận m1 và m2 như sau.

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

Chúng tôi có thể tạo hai danh sách khác nhau, thứ nhất là danh sách và thứ hai là không.

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

In[4]:= TensorQ[mList1] 

Out[4]= True 

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

In[6]:= TensorQ[mList2] 

Out[6]= False 

Tương tự như vậy, chúng ta hãy V1 và V2 là hai vectơ và vList1 và vList2 được hai danh sách như sau

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 

Bây giờ chúng ta định nghĩa hai hàm listable Func1 và 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 
    ]; 

công trình Func1 trên cả hai danh sách tensor và non tensor như có thể thấy bên dưới

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 hoạt động trên các tensor liệt kê mList1 và vList1 và một hằng số thực như sau

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

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

Chức năng là khả năng sử dụng các đơn thực 5.0, lặp đi lặp lại.

Tuy nhiên, cùng một chức năng không hoạt động trên danh sách không phải là tensor mList2 và vList2. Sau đây tắt hạt nhân của tôi (Mathematica 8.0.4, trên Windows Vista).

func2[mList2, vList2, 5.0] 

Điều thú vị là các công trình sau đây.

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

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

Ai cũng có thể giải thích về hành vi này?

+4

Đây là lỗi và đã được khắc phục trong phiên bản phát triển. Bây giờ bạn phải sử dụng phiên bản {5., 5.}. –

+0

@ruebenko: Lỗi này dường như tồi tệ hơn với Song song-> Đúng. – asim

+1

@ruebenko Tôi khuyến khích bạn đăng câu trả lời đó để câu hỏi này dường như không được trả lời. –

Trả lời

3

Đây là lỗi và đã được khắc phục trong phiên bản phát triển. Bây giờ bạn phải sử dụng phiên bản {5., 5.}.

Các vấn đề liên quan