八度:使用trace()的效率?

时间:2011-11-18 02:02:44

标签: octave

假设我有两个5000 x 1000矩阵,A和B.将八度计算trace(A*B')有效,即只需要5000个内部产品而不是5000 * 5000内部产品,其中大多数不会是使用

而且,如果trace的论点更复杂,即:trace(A*B' + C*D')怎么办?这有什么改变吗?

2 个答案:

答案 0 :(得分:2)

在使用trace(A*B')之前,

trace()会计算完整的矩阵产品。

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

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

trace(A*B' + C*D')将由sum((A.*conj(B) + C.*conj(D))(:))有效计算。

答案 1 :(得分:1)

不,在调用trace()之前将评估产品。一个有效的实现方法是手动计算该矩阵的对角线项,然后将它们加起来sum(sum(diag(A) .* diag(B)));,作为第二个例子sum(sum(diag(A) .* diag(B) + diag(C) .* diag(D)))

请注意,您可以略微缩短这两个表达式,并且可能会因为可读性和Matlab兼容性而失去一点速度:sum((diag(A) .* diag(B))(:));