我有兴趣在不需要张量的列表上使用 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}}
该功能能够重复使用单个real 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}}
任何人都可以解释这种行为吗?