在非张量列表上使用已编译的可列表函数

时间:2011-11-24 20:30:35

标签: wolfram-mathematica mathematica-8

我有兴趣在不需要张量的列表上使用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 个答案:

答案 0 :(得分:3)

这是一个错误,已在开发版本中修复。现在你必须使用{5.,5.}版本。