Использование скомпилированной listable-функции в нетензорных списках

Я заинтересован в использовании функции Listable Compiled для списков, которые не обязательно должны быть тензорами. Я хочу понять, почему некоторые функции работают, а другие нет и закрывают ядро. Вот пример.

Предположим, у нас есть две матрицы 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}}

Кто-нибудь может объяснить это поведение?

1 ответ

Решение

Это ошибка, которая была исправлена ​​в версии для разработчиков. На данный момент вы должны использовать версию {5.,5.}.

Другие вопросы по тегам