Octave 倍频程:使用trace()的效率?

Octave 倍频程:使用trace()的效率?,octave,Octave,假设我有两个5000 x 1000矩阵,A和B。倍频程计算跟踪(A*B')是否有效,即只需要5000内积,而5000*5000内积大部分不使用 如果trace的参数更复杂,即:trace(A*B'+C*D'),该怎么办?这会改变什么吗?否,在调用trace()之前将对产品进行评估。一种有效的实现方法是手动计算该矩阵的对角线项相乘,然后对它们求和sum(sum(diag(A)。*diag(B))对于第二个示例sum(sum(diag(A)。*diag(B)+diag(C)。*diag(D)) 请注

假设我有两个5000 x 1000矩阵,A和B。倍频程计算
跟踪(A*B')
是否有效,即只需要5000内积,而5000*5000内积大部分不使用


如果
trace
的参数更复杂,即:
trace(A*B'+C*D')
,该怎么办?这会改变什么吗?

否,在调用trace()之前将对产品进行评估。一种有效的实现方法是手动计算该矩阵的对角线项相乘,然后对它们求和
sum(sum(diag(A)。*diag(B))对于第二个示例
sum(sum(diag(A)。*diag(B)+diag(C)。*diag(D))

请注意,您可以稍微缩短这两个表达式,并可能在失去可读性和Matlab兼容性的情况下获得一点速度,如:
sum((diag(a)。*diag(B))(:)

trace(A*B')
将在使用
trace()
之前计算完整的矩阵积

更有效的方法是
sum(sum(A.*conj(B),2))
。内和计算得到的矩阵的值

一种可能更有效的方法是通过`求和((A.*conj(B))(:)一步完成两个求和

trace(A*B'+C*D')
将通过
sum((A.*conj(B)+C.*conj(D))(:)
有效地计算