Octave 倍频程:使用trace()的效率?
假设我有两个5000 x 1000矩阵,A和B。倍频程计算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)) 请注
跟踪(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))(:)
有效地计算