给定任何实系数矩阵nxn矩阵,我们可以定义一个双线性形式
bA(x, y) = xTAy ,
一个二次型
qA(x) = bA(x, x) = xTAx .
(对于最常见的二次型的应用,矩阵是对称的,甚至是对称的正定的,如果你的答案很重要的话,你可以假设这两种情况中的任何一种都是这样。)
(此外,FWIW、bI及qI(其中I是nxnxnn身份矩阵)分别是标准内积,平方的平方L22R
现在假设我有两个nxm矩阵,x和Y,还有一个nxn矩阵A。本人愿优化两个bAAA(x,I,y
我能想到的唯一解决方案是分别用(块)对角元素X,[Y]和[A,分别生成维数mnXm,mnXm和mnXmn,[Y,IX,IX,A,分别是A。那么所需的计算将是矩阵乘法[X]T[A][Y]和[X]T[A][X]。这一策略绝对是毫无创意的,但如果有一种方法在时间和空间上都有效的话,我想看看。(不用说,任何不利用这些块矩阵稀疏性的实现都将注定失败。)
有更好的方法吗?在
我更喜欢使用numpy,但是对于支持高效矩阵计算的其他系统,比如R或Matlab,答案也可以(假设我可以找到如何将它们移植到numpy)。在
谢谢!在
当然,计算产品XTAY和XTAX的产品计算,当然会计算出所期望的bem>AA(X,i,iy,i)和q
我们并不完全清楚您要实现什么,但是在R中,您使用}具有兼容的维数,
crossprod
来形成交叉积:给定的矩阵X
和{crossprod(X, Y)
返回XTY。类似地,矩阵乘法是通过%*%
运算符实现的:X %*% Y
返回乘积XY。因此,你可以得到XTAY作为crossprod(X, A %*% Y)
,而不必担心矩阵乘法、循环等机制。在如果你的矩阵有一个特殊的结构,允许优化计算(对称、三角形、稀疏、带状等),你可以看看
Matrix
包,它对此有一些支持。在我没有用过Matlab,但我相信它对这些操作也有类似的功能。在
如果你想在MATLAB中实现它,它非常简单:
你可以打字
我怀疑这是否值得,但如果你想加快速度,你可以试试这个:
^{2}$以下是numpy中的一个解决方案,它可以满足您的需要:
这会对XT*A进行矩阵乘法,然后进行逐元素数组乘法以乘以YT。然后将结果数组的行相加,得到一个一维数组。在
相关问题 更多 >
编程相关推荐