kjo*_*kjo 6 python matlab numpy r matrix
给定实数系数A的任何n × n矩阵,我们可以定义双线性形式b A:R n x R n → R by
b A(x,y)= x T Ay,
和二次形式q A:R n → R by
q A(x)= b A(x,x)= x T Ax.
(对于二次型q A的大多数常见应用,矩阵A是对称的,或者甚至是对称的正定,所以如果对你的答案很重要,可以随意假设其中任何一个都是这种情况.)
(另外,FWIW,b I和q I(其中I是n x n单位矩阵)分别是标准内积,并且在R n上的平方L 2范数,即x T y和x T x.)
现在假设我有两个Ñ X 米矩阵,X和ÿ和Ñ X Ñ矩阵甲.我想优化b A(x ,i,y ,i)和q A(x ,i)的计算(其中x ,i和y ,i分别表示X和Y的第i列)我推测,至少在像numpy,R或Matlab这样的环境中,这将涉及某种形式的矢量化.
我能想到的唯一解决方案需要生成对角块矩阵[ X ],[ Y ]和[ A ],分别为维数mn x m,mn x m和mn x mn,以及(块)对角元素x , i,y ,i和A分别.然后,期望的计算将是矩阵乘法[ X ] T [ A ] [ Y ]和[ X ] T [ A ] [ X ].这种策略绝对没有灵感,但如果有办法在时间和空间方面都很有效,我希望看到它.(不言而喻,任何不利用这些块矩阵的稀疏性的实现都将注定失败.)
有更好的方法吗?
我对系统的偏好是numpy,但是支持高效矩阵计算的其他系统(如R或Matlab)的答案也可以(假设我可以弄清楚如何将它们移植到numpy).
谢谢!
当然,计算乘积X T AY和X 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),(对于i ≠ j),所以这是一个非启动者.
这是 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。然后对所得数组的行进行求和以生成一维数组。