如何对双线性和二次型的评估进行矢量化?

kjo*_*kjo 6 python matlab numpy r matrix

给定实数系数A的任何n × n矩阵,我们可以定义双线性形式b A:R n x R nR by

b A(x,y)= x T Ay,

和二次形式q A:R nR by

q A(x)= b A(x,x)= x T Ax.

(对于二次型q A的大多数常见应用,矩阵A是对称的,或者甚至是对称的正定,所以如果对你的答案很重要,可以随意假设其中任何一个都是这种情况.)

(另外,FWIW,b Iq I(其中In x n单位矩阵)分别是标准内积,并且在R n上的平方L 2,即x T yx T x.)

现在假设我有两个Ñ X 矩阵,XÿÑ X Ñ矩阵.我想优化b A(x ,i,y ,i)和q A(x ,i)的计算(其中x ,iy ,i分别表示XY的i列)我推测,至少在像numpy,R或Matlab这样的环境中,这将涉及某种形式的矢量化.

我能想到的唯一解决方案需要生成对角块矩阵[ X ],[ Y ]和[ A ],分别为维数mn x m,mn x mmn x mn,以及(块)对角元素x , i,y ,iA分别.然后,期望的计算将是矩阵乘法[ X ] T [ A ] [ Y ]和[ X ] T [ A ] [ X ].这种策略绝对没有灵感,但如果有办法在时间和空间方面都很有效,我希望看到它.(不言而喻,任何不利用这些块矩阵的稀疏性的实现都将注定失败.)

有更好的方法吗?

我对系统的偏好是numpy,但是支持高效矩阵计算的其他系统(如R或Matlab)的答案也可以(假设我可以弄清楚如何将它们移植到numpy).

谢谢!

当然,计算乘积X T AYX T AX将计算所需的b A(x ,i,y ,i)和q A(x ,i)(作为得到的m × m矩阵的对角线元素),连同O(m 2)无关的b A(x ,i,y ,j)和b A(x ,i,x ,j),(对于ij),所以这是一个非启动者.

J. *_*ran 5

这是 numpy 中的解决方案,应该可以满足您的需求:

((np.matrix(X).T*np.matrix(A)).A * Y.T.A).sum(1)
Run Code Online (Sandbox Code Playgroud)

这对 X T * A 进行矩阵乘法,然后进行逐元素数组乘法以乘以 Y T。然后对所得数组的行进行求和以生成一维数组。