假设我有两个5000 x 1000矩阵,A和B.将八度计算trace(A*B')
有效,即只需要5000个内部产品而不是5000 * 5000内部产品,其中大多数不会是使用
而且,如果trace
的论点更复杂,即:trace(A*B' + C*D')
怎么办?这有什么改变吗?
答案 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))(:));