【发布时间】:2011-12-31 21:25:00
【问题描述】:
假设我有两个 5000 x 1000 矩阵,A 和 B。octave 是否可以有效地计算 trace(A*B'),即只需要 5000 个内积而不是 5000*5000 个内积,其中大部分不会被使用?
而且,如果trace 的参数更复杂,例如:trace(A*B' + C*D'),该怎么办?这有什么改变吗?
【问题讨论】:
标签: octave
假设我有两个 5000 x 1000 矩阵,A 和 B。octave 是否可以有效地计算 trace(A*B'),即只需要 5000 个内积而不是 5000*5000 个内积,其中大部分不会被使用?
而且,如果trace 的参数更复杂,例如:trace(A*B' + C*D'),该怎么办?这有什么改变吗?
【问题讨论】:
标签: octave
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))(:)) 高效计算。
【讨论】:
不,产品将在调用 trace() 之前进行评估。一种有效的实现是仅手动计算该矩阵的对角项相乘,然后将它们相加sum(sum(diag(A) .* diag(B))); 第二个示例sum(sum(diag(A) .* diag(B) + diag(C) .* diag(D)))
请注意,您可以稍微缩短这两个表达式,并且可能会在失去可读性和 Matlab 兼容性的情况下获得一点速度,如下所示:sum((diag(A) .* diag(B))(:));
【讨论】: