c++ - 优化特征表达
问题描述
我正在尝试优化此乘法的代码:
A += s * (C + (D-U) * (D-U).transpose());
其中s
是标量,C
是矩阵(通常为 10x10),D
是U
向量。我试过:
A.noalias() += s * (C + (D-U) * (D-U).transpose());
但我认为阅读文档还不够。在本征中优化此表达式的最佳方法是什么?
解决方案
首先评估D-U
一个临时向量,以便它只评估一次,然后,由于您的向量很小,请尝试替换*
为.lazyProduct(...)
. 更准确地说,您最终会得到:
auto DU = (D-U).eval();
A.noalias() += s * (C + DU.lazyProduct(DU.transpose()));
当然,您必须准确地对每个更改进行基准测试,并启用完整的编译器优化,以查看它们是否真的有效并且不会适得其反。
最后,如果A
和C
是对称的,您可能会想只更新 A 的一半。这对于大型矩阵(例如,>200x200)是有意义的,但是由于您的矩阵非常小,这将适得其反,因为逻辑开销和更少有效的 SIMD。
推荐阅读
- prometheus - 使用 Python 在 Prometheus 中编写多个自定义收集器
- objective-c - @property(复制)与方法 [复制]
- python - 获取无效参数:在 keras 中使用 IoU 度量时,所有输入的形状必须匹配:values[0].shape = [401408] != values[1].shape = [24485888]
- android - 当来自原生 android 方法通道的回调时,在 dart 中运行方法或函数
- go - 为什么我不能从 grpc 得到非零响应和错误
- javascript - 排除不适用于尝试从包中排除非 node_modules 脚本
- angular - 如何操作和重新发送 Observable
- java - 在泛型类中实现 compareTo
- c++ - 模板运算符 [] 重载奇怪的 C2676
- python - 为什么我通过 CLI 部署在 IBM CloudFoundry 上的 Flask Web 应用程序突然停止了?