【问题标题】:octave: efficiency of using trace()?八度:使用 trace() 的效率?
【发布时间】: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


    【解决方案1】:

    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))(:)) 高效计算。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-08
        • 2012-10-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-08
        相关资源
        最近更新 更多