3

对于结果矩阵中的每个位置,我不想将相应行和列的点积存储在参数矩阵中,而是存储元素明智乘积,这将是一个扩展到第三维的向量。

一个想法是将参数矩阵转换为带有向量条目的向量,然后取它们的外积,但我也不知道该怎么做。

编辑:

在看到回复之前,我想通了。这是我的解决方案:

def newdot(A, B):
  A = A.reshape((1,) + A.shape)
  B = B.reshape((1,) + B.shape)

  A = A.transpose(2, 1, 0)
  B = B.transpose(1, 0, 2)

  return A * B

我正在做的是将要获取其外部产品的每一行和列对分开,并形成它们的两个列表,然后将它们的内容矩阵并行相乘。

4

1 回答 1

3

这有点令人费解(而且难以解释),但这个函数应该可以为您提供所需的内容:

def f(m1, m2):
    return (m2.A.T * m1.A.reshape(m1.shape[0],1,m1.shape[1]))

m3 = m1 * m2
m3_el = f(m1, m2)

m3[i,j] == sum(m3_el[i,j,:])
m3 == m3_el.sum(2)

基本思想是将矩阵转换为数组并进行逐个元素的乘法。其中一个数组被重新整形,使其中间维度的大小为 1,并且数组广播规则将该维度扩展为与另一个数组的高度匹配。

于 2013-05-17T07:13:49.937 回答