给定实数系数 A 的任何 n x n 矩阵,我们可以定义双线性形式 b < sub> 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 单位矩阵)分别是标准内积,平方 L 2 R n 上的-norm,即 x T y 和 x Ť X 。)
现在假设我有两个 n x m 矩阵, X 和 Y ,以及 n x n 矩阵 A 。我想优化 b A 的计算( x ,i , y ,i )和 q A ( x ,我 )(其中 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 ]和[< EM> X Ť [ A ] [ X ]。这种策略绝对没有灵感,但如果有办法在时间和空间方面都很有效,我希望看到它。 (毫无疑问,任何不利用这些块矩阵的稀疏性的实现都将注定失败。)
有更好的方法吗?
我对系统这样做的偏好是numpy,但是对于支持高效矩阵计算的其他系统(如R或Matlab)而言,答案也可以(假设我可以弄清楚如何将它们移植到numpy) )。
谢谢!
<子> 当然,计算产品 X T AY 和 X T AX 会计算出所需的 b < / em> A ( x ,i , y ,i )和 q A ( x ,i )(如得到的 m x m 矩阵的对角元素),以及 O ( m 2 )无关 b A ( x ,i , y ,j )和 b A ( x ,i , x ,j ),( i ≠ j ),所以这是一个非首发。
答案 0 :(得分:4)
这是一个numpy解决方案,可以为您提供所需的内容:
((np.matrix(X).T*np.matrix(A)).A * Y.T.A).sum(1)
这对X T * A进行矩阵乘法,然后将逐个元素的数组乘法乘以Y T 。然后将得到的数组的行相加以产生1-D数组。
答案 1 :(得分:1)
目前还不完全清楚您要实现的目标,但在R中,您使用crossprod
来形成交叉产品:给定矩阵X
和Y
具有兼容尺寸,{ {1}}返回X T Y.同样,使用crossprod(X, Y)
运算符实现矩阵乘法:%*%
返回乘积XY。所以你可以得到X T AY为X %*% Y
,而不必担心矩阵乘法,循环或其他什么的机制。
如果您的矩阵具有允许优化计算的特定结构(对称,三角形,稀疏,带状,......),您可以查看crossprod(X, A %*% Y)
包,它对此有一些支持。
我没有使用过Matlab,但我确信它会为这些操作提供类似的功能。
答案 2 :(得分:-1)
如果你想在MATLAB中这样做,那真的很简单:
您只需输入
即可b = x'*A*y;
q = x'*A*x;
我怀疑是否值得付出努力,但如果你想加快速度,你可以试试这个:
M = x'*A;
b = M*y;
q = M*x;